日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【bzoj3631】[JLOI2014]松鼠的新家

發布時間:2024/4/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【bzoj3631】[JLOI2014]松鼠的新家 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目大意就是按照他給的順序遍歷樹,問每個節點會經過幾次,最后的那個要減1

類似前綴和的思想?

從起點x到終點y,只需給x,y兩個結點加1,給LCA(x,y),fa[LCA(x,y)]減1,最后做一次從底到根的遞推即可求出每個點在多少條鏈上?

#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std;typedef long long LL;#define N 300010struct edge {int to,next; }e[N<<2]; int head[N<<2]; int cnt;int n; int id; int x,y;int a[N],ans[N]; int siz[N],dep[N],fa[N],top[N],son[N],dfn[N];inline int getint() {int x=0,f=1;char ch=getchar();while (ch>'9' || ch<'0') {if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f; }void link(int x,int y) {e[++cnt]=(edge){y,head[x]};head[x]=cnt; }void dfs(int x) {siz[x]=1;son[x]=0;dfn[++id]=x;for (int i=head[x];i;i=e[i].next){int v=e[i].to;if (fa[x]!=v){fa[v]=x;dep[v]=dep[x]+1;dfs(v);siz[x]+=siz[v];if (siz[v]>siz[son[x]])son[x]=v;}} }void dfs2(int x,int d) {top[x]=d;if (son[x])dfs2(son[x],d);for (int i=head[x];i;i=e[i].next){int v=e[i].to;if (fa[x]!=v && son[x]!=v)dfs2(v,v);} }int lca(int x,int y) {while (top[x]!=top[y]){int a=top[x];int b=top[y];if (dep[a]<dep[b])swap(a,b),swap(x,y);x=fa[top[x]];}return dep[x]<dep[y] ? x : y; }int main() {n=getint();for (int i=1;i<=n;i++)a[i]=getint();for (int i=1;i<n;i++){x=getint();y=getint();link(x,y);link(y,x);}dfs(1);dfs2(1,1);for (int i=2;i<=n;i++){int u=a[i-1],v=a[i],w=lca(u,v);ans[u]++;ans[v]++;ans[w]--;ans[fa[w]]--;}for (int i=n;i>=1;i--)ans[fa[dfn[i]]]+=ans[dfn[i]];for (int i=1;i<=n;i++)if (a[1]!=i)printf("%d\n",ans[i]-1);elseprintf("%d\n",ans[i]);return 0; }

  

?

轉載于:https://www.cnblogs.com/yangjiyuan/p/5503196.html

總結

以上是生活随笔為你收集整理的【bzoj3631】[JLOI2014]松鼠的新家的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。