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

2021-08-07 19:09:49 字數 1361 閱讀 2095

題目鏈結

思路:對於這種詢問樹的路徑的題,第一反應就是樹鏈剖分,但與多個給定值異或後的最大值卻沒有辦法去高效維護。

考慮另外的思路。

有關異或的資料結構,自然會想到01字典樹,聯絡乙個經典問題:

求乙個數與乙個數集中的某個數異或的最大值

而對於此題,每乙個詢問相當於給定了乙個數集,只不過其中的數是一條路徑上所有頂點的值。

故可以從根出發,對於每乙個節點,都維護乙個從根到它自己所經過的所有頂點值的字首字典樹,對於詢問就能通過差分的思想來對給定值進行匹配,從而得到異或的最大值。

注意要單獨計算給定值與lca的異或值,這題我是用的樹鏈剖分來求lca

**:

#include

#include

#include

using

namespace std;

const

int a =

1e5+10;

class

grag[a<<1]

;class

trie

t[a<<5]

;int val[a]

,head[a]

,root[a]

,tot,twt,n,m;

int dep[a]

,son[a]

,fa[a]

,siz[a]

,top[a]

;void

init()

void

add(

int u,

int v)

void

input()

}void

dfs(

int u,

int pre,

int d)}}

void

dfs(

int u,

int tp)

}int

lca(

int u,

int v)

return dep[u]

>dep[v]

?v:u;

}int

insert

(int y,

int v)

return res;

}void

dfs(

int u)

}int

query

(int x,

int y,

int z,

int v)

return

max(ans,res);}

void

solve()

}int

main()

return0;

}

hdu4757 (可持久化字典樹 LCA)

給一棵樹,每個節點有權值。每次詢問要求回答乙個值異或某條路徑上的乙個點的最大值。我們可以對每乙個點開乙個字典樹,記錄從這個點到根的路徑上的所有數,然後求兩點的lca,然後把路徑分成左端點到lca的路和右端點到lca的路來做。includeusing namespace std const int m...

HDU3966 樹鏈剖分

題目 aragorn s story 題意 給一棵樹,並給定各個點權的值,然後有3種操作 i c1 c2 k 把c1與c2的路徑上的所有點權值加上k d c1 c2 k 把c1與c2的路徑上的所有點權值減去k q c 查詢節點編號為c的權值 分析 典型的樹鏈剖分題目,先進行剖分,然後用線段樹去維護即...

hdu5029 樹鏈剖分

這題絕對好題。題意很簡單,也很容易想到樹鏈剖分,之後就不太好做了。開始想的是按顏色排序,然後每次處理一種顏色,求出最優解。這樣做的話,最壞情況會退化到n 2,不可接受。之後用線段樹維護,乙個節點只存在一種顏色,而且排序之後能保證在樹中顏色不會交叉,pushdown的時候可以將兩種都不是當前正在處理的...