JLOI2014 松鼠的新家

2021-07-22 08:09:37 字數 1413 閱讀 8066

裸的 樹鏈剖分 ^.^

然而 並不用線段樹

求x,y的lca 後 ,在 x上標記加一,y上標記加一 ,lca標記減一,fa[lca]標記減一

#include

int n;

int shunxv[300005];

int to[600005],next[600005],head[600005],cnt;

void add(int

x,int

y)int siz[300005],dep[300005],fa[300005],son[300005],top[300005];

int candy[300005],ans[300005];

void dfs1(int

x,int from)//求siz,dep,fa,son

void dfs2(int

x,int from)//求 top

}}int lca(int

x,int

y) while(top[x]!=top[y])

}if(dep[x]y]) return

x; else

returny;}

void getans(int

x,int from)

}}int main()

for(i=1;iint

x,y;

scanf("%d

%d",&x,&y);

add(x,y);

add(y,x);

}int root=shunxv[1];

dfs1(root,0);

dfs2(root,0);

/*for(i=1;i<=n;i++)

*//*for(i=1;i<=n;i++)

}*/for(i=1;iint lcanc=lca(shunxv[i],shunxv[i+1]);

candy[shunxv[i]]++;

candy[shunxv[i+1]]++;

candy[lcanc]--;

candy[fa[lcanc]]--;

}getans(root,0);

for(i=2;i<=n;i++)

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

return0;}

/*998

7654

3211

2314

1522

6729

638*/

/*/*記siz[v]表示以v為根的子樹的節點數,dep[v]表示v的深度(根深度為1),top[v]表示v所在的鏈的頂端節點,

fa[v]表示v的父親,son[v]表示與v在同一重鏈上的v的兒子節點(姑且稱為重兒子),

只要把這些東西求出來,就能用logn的時間完成原問題中的操作。

*/

JLOI2014 松鼠的新家

time limit 10 sec memory limit 128 mb submit 1736 solved 840 松鼠的新家是一棵樹,前幾天剛剛裝修了新家,新家有n個房間,並且有n 1根樹枝連線,每個房間都可以相互到達,且倆個房間之間的路線都是唯一的。天哪,他居然真的住在 樹 上。松鼠想邀請...

JLOI2014 松鼠的新家

松鼠的新家是一棵樹,前幾天剛剛裝修了新家,新家有n個房間,並且有n 1根樹枝連線,每個房間都可以相互到達,且倆個房間之間的路線都是唯一的。天哪,他居然真的住在 樹 上。松鼠想邀請小熊維尼前來參觀,並且還指定乙份參觀指南,他希望維尼能夠按照他的指南順序,先去a1,再去a2,最後到an,去參觀新家。可是...

JLOI 2014 松鼠的新家

傳送門 前幾天松鼠剛剛裝修了新家,新家有 n nn 個房間,並且有 n 1 n 1n 1 根樹枝連線,每個房間都可以相互到達,且任意兩個房間之間的路線都是唯一的。松鼠想邀請小熊維尼前來參觀,並且還指定乙份參觀指南,他希望維尼能夠按照他的指南順序,先去 a 1a 1 a1 再去 a 2a 2 a2 c...