傳送門
題解:對點到根維護權值線段樹,每次連邊就進行啟發式合併(用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 之間有一條無向邊,接下...