BZOJ3674 可持久化並查集加強版

2022-05-09 17:08:05 字數 1875 閱讀 6095

[bzoj3674]可持久化並查集加強版

試題描述

輸入

見「試題描述

輸出

見「試題描述

輸入示例

561

1231

2213

0321

312

輸出示例

1

01

資料規模及約定

見「試題描述

題解

#include #include #include #include #include #include #include #include #include #include #include using namespace std;

const int buffersize = 1 << 16;

char buffer[buffersize], *head, *tail;

inline char getchar()

return *head++;

}int read()

while(isdigit(c))

return x * f;

}#define maxn 200010

#define maxnode 14400000

int tot, fa[maxnode], siz[maxnode], lc[maxnode], rc[maxnode];

void updatefa(int& y, int x, int l, int r, int p, int fa)

int mid = l + r >> 1; lc[y] = lc[x]; rc[y] = rc[x];

if(p <= mid) updatefa(lc[y], lc[x], l, mid, p, fa);

else updatefa(rc[y], rc[x], mid+1, r, p, fa);

return ;

}void updatesiz(int& y, int x, int l, int r, int p, int siz)

int mid = l + r >> 1; lc[y] = lc[x]; rc[y] = rc[x];

if(p <= mid) updatesiz(lc[y], lc[x], l, mid, p, siz);

else updatesiz(rc[y], rc[x], mid+1, r, p, siz);

}int qfa(int o, int l, int r, int p)

int qsiz(int o, int l, int r, int p)

int n, rt[maxn];

int findset(int o, int x)

int main()

int sa = qsiz(rt[i-1], 1, n, a), sb = qsiz(rt[i-1], 1, n, b);

if(sa < sb) swap(a, b), swap(sa, sb);

updatefa(rt[i], rt[i-1], 1, n, b, a);

updatesiz(rt[i], rt[i], 1, n, a, sa + sb);

} if(tp == 2)

if(tp == 3)

// printf("tot: %d\n", tot); }

return 0;

}

BZOJ 3674 可持久化並查集

3674 可持久化並查集加強版 time limit 15 sec memory limit 256 mb submit 4051 solved 1503 submit status discuss description description 自從zkysb出了可持久化並查集後 hzwer 亂寫...

bzoj 3674 可持久化並查集)

傳送門 題解 一道可持久化並查集的裸題,板子子對了就能過 可持久化並查集是基於主席數的一種結構,可持久化並查集要求能夠訪問歷史版本,跟主席樹很像,所以可以通過主席樹維護普通並查集的fa陣列,但是由於用主席樹維護後沒有辦法用路徑壓縮,所以需要採用新的合併方式 啟發式合併,對每乙個節點增加乙個level...

bzoj 3674 可持久化並查集加強版

description 自從zkysb出了可持久化並查集後 hzwer 亂寫能ac,暴力踩標程 kuribohg 我不路徑壓縮就過了!ndsf 暴力就可以輕鬆虐!zky bzoj 3673的加強版。就沒了。include using namespace std const int n 200000 ...