bzoj3696 化合物 樹形dp

2022-05-20 10:52:44 字數 1104 閱讀 6648

題目描述

首長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 100010

using 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...