樹剖裸題。
每次將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...