hdu4757 (可持久化字典樹 LCA)

2022-03-06 21:54:41 字數 788 閱讀 6574

給一棵樹,每個節點有權值。每次詢問要求回答乙個值異或某條路徑上的乙個點的最大值。

我們可以對每乙個點開乙個字典樹,記錄從這個點到根的路徑上的所有數,然後求兩點的lca,然後把路徑分成左端點到lca的路和右端點到lca的路來做。

#includeusing namespace std;

const int maxx = 1e5+10;

struct node

e[maxx*2];

int head[maxx],cnt;

int depth[maxx],fa[maxx][22],lg[maxx];

int trie[20*maxx][2],sum[20*maxx],val[20*maxx],tot;

int rt[maxx];

int a[maxx];

void add(int u,int v)

void update(int u,int v,int x)

val[now]=x;

}int query(int l,int r,int x)

return val[r]^x;

}void dfs(int f,int fath)

void init()

int main()

rt[0]=++tot;

dfs(1,0);

for(int i=1;i<=n;i++)

lg[i]=lg[i-1]+(1

while(m--)

}return 0;

}

HDU 4757 樹鏈剖分 可持久化字典樹

題目鏈結 思路 對於這種詢問樹的路徑的題,第一反應就是樹鏈剖分,但與多個給定值異或後的最大值卻沒有辦法去高效維護。考慮另外的思路。有關異或的資料結構,自然會想到01字典樹,聯絡乙個經典問題 求乙個數與乙個數集中的某個數異或的最大值 而對於此題,每乙個詢問相當於給定了乙個數集,只不過其中的數是一條路徑...

可持久化字典樹

以每個結點為根,建一顆字典樹 內容為1到i的值 這樣之後,做差後,即為一段區間或是一段路徑。可以發現,如果裸著建,不僅要消耗很多的時間,更是要消耗很多的空間。考慮以i為根的字典樹和以 i 1 為跟的字典樹的異同。可以發現,在當前以i為根的字典樹上減去a i 就是 i 1 的字典樹了。所以,我們可以將...

可持久化Trie HDU4757 Tree

恩,剛學了一發可持久化trie樹,其實挺簡單的。反正可持久化資料結構都乙個樣嘛,動態加點就好了。還是寫一篇部落格給自己看吧。因為樹上的路徑嘛,肯定要想到把路徑分成兩部分,x lca x,y 和 y lca x,y 這就相當與兩塊區間,然後求單點異或最大值,自然就想到可持久化了唄。想想你怎麼用可持久化...