HDU 5589(莫隊,字典樹)

2022-05-24 15:09:10 字數 2642 閱讀 7824

2015-12-07 22:07:37

【傳送門】

題意:一棵樹有n個節點,編號為1到n,每條邊都有邊權。定義f(u,v)為從u到v路徑上所有邊權的異或和。給定乙個數m,有q次查詢,每次給定乙個區間[l,r],詢問有多少對(u,v)滿足f(u,v)>m (l <=u

思路:考慮離線莫隊,先處理處f[i]表示從根1到點i的路徑的xor和。對於更改,等價於處理從乙個點出發到若干個點的路徑xor和大於m的個數。可以用字典樹存下當前存在的所有路徑xor和,當查詢時,如果要》m,必然是二進位制下某一位,xor和為1,m為0,且比該位高的數字都相同。那麼就可以在字典樹上記錄一下子樹大小sz,然後列舉不同的那一位。

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 

9 #include 10 #include 11 #include

12 #include 13 #include 14

using

namespace

std;

1516

#define getmid(l,r) ((l) + ((r) - (l)) / 2)

17#define mem(a,b) memset(a,b,sizeof(a))

18#define mp(a,b) make_pair(a,b)

19#define pb push_back

2021 typedef long

long

ll;22 typedef pairpii;

23const

double eps = 1e-8;24

const

int inf = (1

<< 30) - 1;25

const

int maxn = 100010;26

27int

n,m,q;

28int

block,tot;

29int

first[maxn],ecnt;

30int

f[maxn];

31int ms[30

];32

ll ans;

3334

struct

edgee[maxn << 1

];37

38struct

nodeq[maxn];

4243

struct

triet[maxn * 30

];47

48bool

cmp(node a,node b)

5152

bool

cmp_id(node a,node b)

5556 inline void clear(int

p)60

61void dfs(int p,int pre,int

cur)68}

6970

void insert_tree(int

v),sz = 0;72

int p = 0;73

while

(v)77

for(int i = 20; i >= 1; --i)

83 p =t[p].nxt[id];

84 t[p].sz++;85}

86}8788

void delete_tree(int

v),sz = 0;90

int p = 0;91

while

(v)95

for(int i = 20; i >= 1; --i)

101 p =t[p].nxt[id];

102 t[p].sz--;

103}

104}

105106 ll query_tree(int

v),sz = 0

;108

int p = 0

;109 ll res = 0

;110

while

(v)114

for(int i = 20; i >= 1; --i)

121else

126}

127return

res;

128}

129130 inline void add_edge(int u,int v,int

c)136

137void update(int l,int r,int

f)144

}145

146void

block()

158 sort(q + 1,q + q + 1

,cmp_id);

159for(int i = 1; i <= q; ++i)

162}

163164

intmain()

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

182 dfs(1,-1,0

);183

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

188block();

189}

190return0;

191 }

HDU6333 莫隊演算法

給你n,m求 i 0mcn i 1 09 7 sum m 10 9 7 i 0m cni 10 9 7 t組資料t 1 05,1 m,n 105 t leq 10 5,1 leq m,n leq 10 5 t 105,1 m,n 10 5。這題常規思路暴力求字首和時間複雜度和空間複雜度都是顯然不夠的...

HDU6333 莫隊演算法

給你n,m求 t組資料 這題常規思路暴力求字首和時間複雜度和空間複雜度都是顯然不夠的,所以,採用莫隊演算法將t個詢問排序,之後將m看做l,n看做r,通過觀察可以發現 所以首先將r加 減到指定行,之後對l進行加 減,設res為答案,即 r加的時候 r減的時候 l加的時候 l減的時候 具體見 inclu...

HDU6333 莫隊演算法

給你n,m求 i 0mc ni 109 7 role presentation style position relative mi 0ci n 10 9 7 i 0 mcni 109 7 t組資料t 105,1 m,n 105 role presentation style position re...