題目描述
首長noi慘跪,於是去念文化課了。現在,他面對一道化學題。
這題的**是因為在乙個奇怪的學校兩個化競黨在玩乙個奇怪的博弈論遊戲。這個遊戲很蛋疼,我相信你們也沒有興趣聽。
由於這個遊戲涉及博弈論,因此化競的同學就要求首長求乙個類似sg函式的值。
他們手中有一種非常神奇的化合物,它的分子由n個原子組成(不要在意乙個原子可能和及其多個原子成鍵這個細節)。這個分子構成乙個樹結構,1號分子為根。 若兩個原子i、j到它們的最近公共祖先的距離分別是li和lj,定義它們的aij值為:
aij=li xor lj
題目要求對於每乙個k(k∈n),求出兩兩a值為k的原子對個數。
輸入第一行乙個整數n。
接下來n-1行,每行乙個整數p,第i行的整數表示第i個原子的父親為p。
輸出從k=0開始,第k+1行輸出兩兩a值為k的原子對個數,輸出到第乙個不為零的數為止。
樣例輸入31
1樣例輸出12
題解樹形dp
第一眼看到這題感覺直接上樹形dp可能會tle,然而貌似資料水。
然後隨便搞了搞就交上去了, 結果不但沒t,而且跑得飛快(cqzhangyu壓了壓狀態然後怒拿rank1)
設f[i][j]表示以i為根的子樹中深度為j的節點個數。
考慮答案,列舉x中深度為j的節點和x的兒子s中深度為k的節點,那麼顯然$ans[(j-deep[x])xor(k-deep[x])]+=f[x][j]*f[s][k]$。
然後再更新x。
上界設的緊一點就可以穩切了。
時間複雜度大概是$o(nh^2)$的。
另外本題親測不需要開long long
upd:正解貌似是fwt,然而好像沒有暴力快。。。
#include #include #include #define n 100010using namespace std;
int head[n] , to[n] , next[n] , cnt , f[510][n] , deep[n] , md[n] , ans[520];
void add(int x , int y)
void dfs(int x)
}int main()
bzoj3696 化合物 樹形dp
化合物 bzoj 3696 題目大意 給你一棵樹,定義兩個點i j之間的a值是 dis i dis lca i,j xor dis j dis lca i,j 對所有的k in 1,n a值等於k的點對數量。注釋 1 le n le 10 5 1 le maxdis le 500 想法 說什麼異或意...
BZOJ3696 化合物 樹形DP 暴力
首長noi慘跪,於是去念文化課了。現在,他面對一道化學題。這題的 是因為在乙個奇怪的學校兩個化競黨在玩乙個奇怪的博弈論遊戲。這個遊戲很蛋疼,我相信你們也沒有興趣聽。由於這個遊戲涉及博弈論,因此化競的同學就要求首長求乙個類似sg函式的值。他們手中有一種非常神奇的化合物,它的分子由n個原子組成 不要在意...
化合物相似性搜尋 RDKit 化合物相似性搜尋
基於python3和rdkit的化合物結構相似性搜尋 化合物相似性在化學資訊學和藥物發現中具有悠久的歷史,許多計算方法採用相似度測定來鑑定研究的新化合物。本例項通過計算分子的morgan指紋進行相似性比對。匯入依賴包 usr bin env python3 from rdkit.chem impor...