HDU 5909 FWT 加速集合異或

2021-07-25 22:21:24 字數 962 閱讀 8595

【題意】

byteasar有一棵n

n個點的無根樹,節點依次編號為11到n

n,其中節點i

i的權值為v_iv​

i​​。

定義一棵樹的價值為它所有點的權值的異或和。

現在對於每個[0,m)[0

,m)的整數k

k,請統計有多少t

t的非空連通子樹的價值等於kk。

一棵樹t

t的連通子樹就是它的乙個連通子圖,並且這個圖也是一棵樹。

【解題思路】 樹形dp。dp[i][j]代表以i為根,異或結果為j的方案數,那麼我們可以寫出樹形dp的大致結構如下:

這段**裡的solve,就是求兩個集合異或的結果,明顯我們暴力做是o(m * m)的, 這裡暴力做,加一些優化,例如讀入掛等是可以莽過去這個題目的。但是這裡有個更經典的加速集合異或的方法,fwt。複雜度可以降為o(m * logm),我給出fwt的模板

const int rev = (mod + 1) >> 1; // fwt

void fwt(int a,int n)

template inline void getmin(t1 &a, t2 b) { if (b> 1; // fwt

const double pi = acos(-1);

//head

//dp[u][i] 表示 u 為根的樹,異或後得到i的方案數

int val[maxn], dp[maxn][maxn], ans[maxn], temp[maxn];

int n, m;

vector g[maxn * 2];

void fwt(int a,int n)

{ for(int d=1;d

hdu6092 01揹包加思維

前置知識這裡 本題已知每種和的個數 存在b陣列裡 由此我們可以遞推求解 b i 前面構造成i大小的方法數 i的個數 此值設為變數num 如b 2 前面構造成2大小的方法數 2的個數 然後就變成了求前面構造成i大小的方法數的問題 這個就是01揹包 a 陣列為物品 價值均為1 重量為a i 所以我們有公...

HDU 2242 雙聯通加樹形DP

邊雙連通還有縮點重新建圖再dfs一次 題意 給乙個無向圖連通,圖中每個結點都有乙個權值,問能否割掉圖中的一條邊,使得圖變為2個連通支,若能,使2個連通支中權值和的差最小,輸出差的絕對值。n 10 4 include include include include include include in...

hdu5297 Y sequence 容斥加迭代

題意 所有正整數遞增排列,刪掉可以寫成a b形式的數 a,b 為正整數,2 b r 得到新序列y。當r 3時,序列為 2,3,5,6,7,10.給定n,r,找到y n y中的第n個元素 資料範圍 n 2 10 18,2 r 62,t 30000.分析 case數很大,n很大,不能暴力解決。第一思路是...