題目鏈結
思路:對於這種詢問樹的路徑的題,第一反應就是樹鏈剖分,但與多個給定值異或後的最大值卻沒有辦法去高效維護。
考慮另外的思路。
有關異或的資料結構,自然會想到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的時候可以將兩種都不是當前正在處理的...