【題意】
byteasar有一棵n【解題思路】 樹形dp。dp[i][j]代表以i為根,異或結果為j的方案數,那麼我們可以寫出樹形dp的大致結構如下:n個點的無根樹,節點依次編號為11到n
n,其中節點i
i的權值為v_iv
i。
定義一棵樹的價值為它所有點的權值的異或和。
現在對於每個[0,m)[0
,m)的整數k
k,請統計有多少t
t的非空連通子樹的價值等於kk。
一棵樹t
t的連通子樹就是它的乙個連通子圖,並且這個圖也是一棵樹。
這段**裡的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很大,不能暴力解決。第一思路是...