3631 JLOI2014 松鼠的新家

2021-08-03 14:05:51 字數 985 閱讀 7788

樹剖裸題。

每次將a[i-1]到a[i]的路徑都加一,輸出時除了a[1]其他都減一即可。

ps:線段樹小技巧

如本題有訪問所有葉子節點的值。只要把整棵樹遍歷一遍,訪問到葉子是記錄下就可以了,o(n)。(然而並沒什麼用)

code:

#include#include#include#includeusing namespace std;

struct trnodetr[600020];int ys[300010],s[300010],z=0,trlen=0;

int ans[300010];

struct nodea[600010];int len=0,last[300010];

int b[300010];

void ins(int x,int y)

int bt(int l,int r)

return x;

}void update(int x)

void change(int x,int l,int r)

if(tr[x].c!=0) update(x);

int mid=(tr[x].l+tr[x].r)/2,lc=tr[x].lc,rc=tr[x].rc;

if(r<=mid) change(lc,l,r);

else if(l>mid) change(rc,l,r);

else change(lc,l,mid),change(rc,mid+1,r);

}void pre_node(int x,int fa)

{ tr[x].fa=fa;tr[x].dep=tr[fa].dep+1;tr[x].tot=1;

for(int i=last[x];i;i=a[i].next)

{int y=a[i].y;

if(y==fa) continue;

pre_node(y,x);tr[x].tot+=tr[y].tot;

if(tr[tr[x].son].tot

3631 JLOI2014 松鼠的新家

題目鏈結 題目大意 給定一棵無根樹和乙個序列,在這個序列上依次遍歷,求每個點的訪問次數題解 裸的樹 上差分,但是根據 題意,前 一次的路 徑的結尾 就是下一 次路徑的 開頭,相 鄰兩次走 的路徑會 有乙個點 重複計算 當然第 一次不會 重複,所 以把差分 陣列ch a a i 2 i n 我的收穫 ...

Bzoj3631 JLOI2014 松鼠的新家

solution 先考慮在序列上的做法。注意到是先處理完所有修改後才做詢問,那麼每次區間加上乙個數時就只須在左右端點分別打上乙個 和 的標記,最後詢問時將整個序列從左到右掃一遍即可。樹上同理。include include include include using namespace std co...

BZOJ3631 JLOI2014 松鼠的新家

題目大意 從編號1到n遍歷圖 中間經過點不算遍歷過 求每個點經過了幾次 樹剖,每次i到i 1都相當於一次鏈上修改,最後單點查詢就行。include include include include define n 300009 define inf 0x7fffff define ll long l...