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

2021-08-14 02:41:25 字數 1220 閱讀 4336

神tm題面是

首先,求樹鏈上第k大,請參看bzoj2588 count on a tree

這道題目於是增添了乙個動態的合併森林的操作

所以直接啟發式合併就可以啦

我第一次交直接t了

加了一堆rg就ac了。。。

神奇的register

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define max 81000

#define rg register

inline

int read()

struct line

e[max<<1];

int h[max],cnt=1;

int p[max][20];

inline

void add(int u,int v)

; h[u]=cnt++;

}struct node

t[max<<9];

int tot,n,t,m;

int fa[max],dep[max],rt[max],sum,s[max];

int a[max];

void modify(int &now,int ff,int l,int r,int pos)

void build(int &now,int l,int r)

void dfs(int u,int ff)

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

int f[max],size[max];

int getf(int x)

void merge(int x,int y)

inline

int lca(int x,int y)

int main()

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

rg char ch[20];

rg int ls=0;

while(t--)

else

}return

0;}

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

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

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

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

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

傳送門 題解 對點到根維護權值線段樹,每次連邊就進行啟發式合併 用size啟發 詢問就按區間第k大的方式詢問,此處不再贅述。吐槽三點 1.說好的多組資料其實只有一組,醉了。2.1e9的資料按理說是需要離散化的,但是離散化了反而要re 可能是個人原因 3.這個 片的int為啥是畸形的。include ...