裸的 樹鏈剖分 ^.^
然而 並不用線段樹
求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...