bzoj 3123(主席樹 啟發式合併)

2021-08-07 16:07:36 字數 1027 閱讀 6287

傳送門

題解:對點到根維護權值線段樹,每次連邊就進行啟發式合併(用size啟發),詢問就按區間第k大的方式詢問,此處不再贅述。

吐槽三點:

1.說好的多組資料其實只有一組,醉了。。。

2.1e9的資料按理說是需要離散化的,但是離散化了反而要re(可能是個人原因)

3.這個**片的int為啥是畸形的。。。

#include

#include

#include

#include

using namespace std;

const int maxn=1e5+2;

int n,m,q,sb,maxx=0,minx=1e9+7;

int a[maxn];//int b[maxn];

int fa[maxn],siz[maxn];

int root[maxn],sum[maxn*260],lc[maxn*260],rc[maxn*260],tim=0;

int head[maxn],edge=0,dep[maxn],anc[maxn][25];

struct edge e[maxn<<1];

inline int

read()

while (c>='0'&&c<='9') x=x

*10+c-'0',c=getchar();

return

x*f;

}inline void adde(int u,int v)

int find(int

x) void modify(int &rt,int pre,int l,int r,int

x) int query(int a,int b,int c,int d,int l,int r,int k)

void dfs(int p,int fat)

}inline int lca(int a,int b)

int main()

else

}return

0;}

BZOJ 3123 森林 主席樹啟發式合併

第一行包含乙個正整數testcase,表示當前測試資料的測試點編號。保證1 testcase 20。第二行包含三個整數n,m,t,分別表示節點數 初始邊數 運算元。第三行包含n個非負整數表示 n個節點上的權值。接下來 m行,每行包含兩個整數x和 y,表示初始的時候,點x和點y 之間有一條無向邊,接下...

BZOJ3123 森林(主席樹,啟發式合併)

神tm題面是 首先,求樹鏈上第k大,請參看bzoj2588 count on a tree 這道題目於是增添了乙個動態的合併森林的操作 所以直接啟發式合併就可以啦 我第一次交直接t了 加了一堆rg就ac了。神奇的register include include include include inc...

BZOJ 3123 森林 主席樹啟發式合併

第一行包含乙個正整數testcase,表示當前測試資料的測試點編號。保證1 testcase 20。第二行包含三個整數n,m,t,分別表示節點數 初始邊數 運算元。第三行包含n個非負整數表示 n個節點上的權值。接下來 m行,每行包含兩個整數x和 y,表示初始的時候,點x和點y 之間有一條無向邊,接下...