BZOJ 3052 糖果公園 樹上帶修改莫隊

2021-08-04 03:25:38 字數 1480 閱讀 2085

time limit: 200 sec  

memory limit: 512 mb

submit: 1264  

solved: 637 [

submit][

status][

discuss]

sample input

84131

2784

submit][

status][

discuss]

home

back

這道題我很快的寫完了但是調了超久,而且這道題200s的限時差點被別人噴成卡時狗...這道題如果t了的話要t三分鐘多,想象就可怕,幸好我主要是wa,雖然t了一次快被機房的人噴成翔...狗眼觀察法怎麼都看不出來**錯了,後來才發現,long long強轉的時候後面被強轉的東西不能打括號,不然的話就是先計算括號內的東西,爆了int以後再轉long long就無濟於事了...

一開始怎麼都不相信是樹上帶修改莫隊,畢竟n的三分之五次方的時間複雜度幾乎就是暴力,這種複雜度只是為了卡掉暴力而已...然而題目的200s允許你這樣暴力...一直沒寫過樹上莫隊,以及帶修改莫隊,正好這道題樹上帶修改莫隊,一舉兩得,趕緊學習一波,一下學兩個就當自虐了...

我們可以發現通過括號序列(dfs序的感覺)可以講兩點的簡單路徑勾勒出來,因為出現兩次的在對應括號序列區間我們會把它^掉,就好像()相消一樣,一旦異或回0就消除當前點的貢獻.將它轉化為普通序列之後,就成為一道lca+普通序列帶修改莫隊了~注意塊的大小.

#include#include#includeusing namespace std;

const int maxn=200005;

typedef long long dnt;

dnt sum,ans[maxn];

int num,cnt1,cnt2,idc,indexx,n,m,t,block,opt;

int f[maxn],g[maxn],in[maxn],seq[maxn*3],h[maxn],last[maxn],blo[maxn*2],id[maxn*2],cnt[maxn],c[maxn],v[maxn],w[maxn],st[maxn*2][19],vis[maxn];

inline int read()

while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();

return f*x;

}struct queryq[maxn],b[maxn];

inline bool cmp(query x,query y)

b[++cnt2].l=l,b[cnt2].t=last[l],last[l]=b[cnt2].r=r;

}l=1,r=0,t=1,sort(q+1,q+cnt1+1,cmp);

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

for(i=1;i<=cnt1;i++) printf("%lld\n",ans[i]);

}

bzoj 3052 糖果公園

題意 給出一顆n個結點的樹,每個結點上有一種糖果 1,m 乙個人經過這個結點品嚐糖果j獲得的愉悅度為w time j val j 其中time j 指j的品嚐次數 給出q次操作,操作有兩種 1 更改某結點的糖果種類 2 查詢某兩個結點路徑上的愉悅度總和 題解 250s的神題,orz各位神犇 將樹分塊...

BZOJ 3052 糖果公園

uoj 58 把樹轉化為尤拉序,把詢問對映到尤拉序上,在尤拉序上跑帶修改莫隊。具體的做法可以參考 國家集訓隊2014 集.pdf 的第82頁描述的性質。include include include include include using namespace std const int maxn...

BZOJ3052 糖果公園

0 題目鏈結 1 題目大意 給定一顆n個點的無根樹,每個點有乙個顏色,要進行q次操作,有兩種操作,顏色總數是m。a query操作,給定起始點和終點,對於這條路徑,從起始點出發,對於沿途的點,如果這個點的顏色j是第i次出現,那麼對於這個詢問的答案的貢獻是vi?wj。b change操作,每次修改乙個...