我們可以樹上分塊,詳見我部落格中雜文下的根號演算法題庫
然後每個塊維護降序,對於整一塊在子樹內的就可以二分,其餘部分暴力。
#include
#include
#include
#include
#define fo(i,a,b) for(i=a;i<=b;i++)
using
namespace
std;
const
int maxn=60000+10,maxc=10000;
int h[maxn],next[maxn*2],go[maxn*2],h2[maxn],n2[maxn],g2[maxn];
int belong[maxn],a[maxn],d[maxn],size[maxn],dl[maxn],ld[maxn];
int b[maxn][200];
int i,j,k,l,r,t,n,m,tot,top,cnt,t2,ans,c,wdc;
void add(int x,int y)
void add2(int x,int y)
void insert(int x,int y)
}void dfs(int x,int y)
else belong[x]=belong[y],insert(belong[y],x);
int t=h[x];
while (t)
}void find(int x,int y)
ans+=l;
}int main()
fo(i,1,n) scanf("%d",&a[i]);
dfs(1,0);
cnt=n;
scanf("%d",&m);
ans=0;
while (m--)
else
if (d[go[t]]>d[dl[l]]) ld[++wdc]=belong[go[t]];
t=next[t];
}l++;
}fo(i,1,wdc) dl[i]=ld[i];
l=1;r=wdc;
while (l<=r)
l++;
}printf("%d\n",ans);
}else
if (t==1)
}else
}a[j]=k;
}else}}
}
BZOJ3720 Gty的妹子樹
如果沒有插入操作,那麼直接對dfs序建立線段樹套平衡樹即可,有插入操作的話,將外層的線段樹換成重量平衡樹即可。一開始寫替罪羊樹套權值線段樹無限mle 所以只好寫替罪羊樹套treap include include includeusing namespace std typedef unsigned...
BZOJ3720 Gty的妹子樹
題目 題解 傳說中的塊狀樹。和鏈剖思想差不多,能塞到父親塊裡的就塞,否則自己新開一塊。只是比較糾結樹分塊究竟用什麼?如果是樹上莫隊的話好像不能這麼分?被菊花卡死?然後我們就每個塊暴力維護資訊。剛開始以為set就行了,到了寫查詢的時候發現尼瑪set是不能維護名次的t t 還是老老實實寫線性表吧。塊開s...
BZOJ 3720 Gty的妹子樹
bzoj 3720 傳送門 這時考慮在樹上分塊,具體內部的操作和在序列上相同 每次通過判斷父節點塊的大小判斷是否要新開一塊 注意每一塊在樹上都是連續的,這樣在查詢時子樹時保證最後全是整塊 不過由於上一條特性導致遇到菊花圖就將每一塊大小卡到了1 複雜度穩定的演算法其實是對修改操作進行分塊 每 sqrt...