BZOJ 3720 Gty的妹子樹

2022-08-16 17:00:17 字數 3104 閱讀 2386

time limit: 10 sec  memory limit: 128 mb

submit: 1889  solved: 654

[submit][status][discuss]

我曾在弦歌之中聽過你,

檀板聲碎,半出折子戲。

舞榭歌台被風吹去,

歲月深處尚有餘音一縷……

gty神(xian)犇(chong)從來不缺妹子……

他來到了一棵妹子樹下,發現每個妹子有乙個美麗度……

由於gty很哲♂學,他只對美麗度大於某個值的妹子感興趣。

他想知道某個子樹中美麗度大於k的妹子個數。

某個妹子的美麗度可能發生變化……

樹上可能會出現乙隻新的妹子……

維護一棵初始有n個節點的有根樹(根節點為1),樹上節點編號為1-n,每個點有乙個權值wi。

支援以下操作:

0 u x          詢問以u為根的子樹中,嚴格大於x的值的個數。(u^=lastans,x^=lastans)

1 u x          把u節點的權值改成x。(u^=lastans,x^=lastans)

2 u x          新增乙個編號為"當前樹中節點數+1"的節點,其父節點為u,其權值為x。(u^=lastans,x^=lastans)

最開始時lastans=0。

輸入第一行包括乙個正整數n(1<=n<=30000),代表樹上的初始節點數。

接下來n-1行,每行2個整數u,v,為樹上的一條無向邊。

任何時刻,樹上的任何權值大於等於0,且兩兩不同。

接下來1行,包括n個整數wi,表示初始時每個節點的權值。

接下來1行,包括1個整數m(1<=m<=30000),表示操作總數。

接下來m行,每行包括三個整數 op,u,v:

op,u,v的含義見題目描述。

保證題目涉及的所有數在int內。

對每個op=0,輸出一行,包括乙個整數,意義見題目描述。

21 2

10 20

10 1 5

22017.9.28新加資料一組by gxzlegend,未重測

by autumn

書上分塊,塊大小調為0.4*sqrt(1.0*n)較為合適

細節太多了太多了,調了我一天

注意排序和復原

#include #define ll long long

#define inf 0x7fffffff

using namespace std;

inline int read()

while(isdigit(ch))

return x*f;

}const int maxn=1e6+10;

struct nodee[maxn];

struct blocblo[400][410<<1];

int len=0,linkk[maxn],n,m,a[maxn],o,dep[maxn],tot=1,siz[maxn],to[maxn],min_b[maxn],dfs_clock=0,dfn[maxn],pos[maxn],ine[maxn],ans;

inline bool cmp_v(bloc n,bloc m)

inline bool cmp_nov(bloc n,bloc m)

for(int i=1;i<=tot;i++) sort(blo[i]+1,blo[i]+siz[i]+1,cmp_v),to[i]=i+1;

to[tot]=inf;

}void solve()

ans=(blo[now][i].v>y);

int limit=blo[now][i].dep;

for(i=i+1;i<=siz[now]&&flag;i++)

else flag=false;

}sort(blo[now]+1,blo[now]+siz[now]+1,cmp_v);

if(!flag)

for(i=to[now];i&&i!=inf;i=to[i])

ans+=maxn;

}else break;

}if(i==inf)

sort(blo[i]+1,blo[i]+siz[i]+1,cmp_nov);

for(int j=1;j<=siz[i]&&blo[i][j].dep>limit;j++)

sort(blo[i]+1,blo[i]+siz[i]+1,cmp_v);

printf("%d\n",ans);

}if(t==1)

}sort(blo[now]+1,blo[now]+siz[now]+1,cmp_v);

}if(t==2)

blo[now][o<<1].nov=blo[now][i].nov+1;

for(i=i+1;idep[n]=blo[now][o<<1].dep=dep[x]+1;

blo[now][o<<1].v=y;blo[now][o<<1].num=n;

sort(blo[now]+1,blo[now]+o*2+1,cmp_nov);

for(i=o+1;i<=o<<1;i++)

if(!ine[n]) ine[n]=now;

for(min_b[tot]=inf,i=1;i<=siz[tot];i++) min_b[tot]=min(min_b[tot],blo[tot][i].dep);

for(min_b[now]=inf,i=1;i<=siz[now];i++) min_b[now]=min(min_b[now],blo[now][i].dep);

sort(blo[tot]+1,blo[tot]+o+1,cmp_v);

sort(blo[now]+1,blo[now]+o+1,cmp_v);

}else

++siz[now];

blo[now][siz[now]].nov=blo[now][i].nov+1;

for(i=i+1;iblo[now][siz[now]].v=y;

blo[now][siz[now]].num=n;

dep[n]=blo[now][siz[now]].dep=dep[x]+1;

sort(blo[now]+1,blo[now]+siz[now]+1,cmp_v);}}

}}int main()

bzoj3720 Gty的妹子樹

我們可以樹上分塊,詳見我部落格中雜文下的根號演算法題庫 然後每個塊維護降序,對於整一塊在子樹內的就可以二分,其餘部分暴力。include include include include define fo i,a,b for i a i b i using namespace std const i...

BZOJ3720 Gty的妹子樹

如果沒有插入操作,那麼直接對dfs序建立線段樹套平衡樹即可,有插入操作的話,將外層的線段樹換成重量平衡樹即可。一開始寫替罪羊樹套權值線段樹無限mle 所以只好寫替罪羊樹套treap include include includeusing namespace std typedef unsigned...

BZOJ3720 Gty的妹子樹

題目 題解 傳說中的塊狀樹。和鏈剖思想差不多,能塞到父親塊裡的就塞,否則自己新開一塊。只是比較糾結樹分塊究竟用什麼?如果是樹上莫隊的話好像不能這麼分?被菊花卡死?然後我們就每個塊暴力維護資訊。剛開始以為set就行了,到了寫查詢的時候發現尼瑪set是不能維護名次的t t 還是老老實實寫線性表吧。塊開s...