javaee论坛

普通会员

225648

帖子

341

回复

355

积分

楼主
发表于 2019-11-03 06:59:39 | 查看: 224 | 回复: 2

题解咕掉了

CODE#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintMAXN=300005;constintLOG=19;intn,m,ans[MAXN],w[MAXN],fir[MAXN],to[MAXN<<1],nxt[MAXN<<1],cnt;inlinevoidlink(intu,intv){to[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;to[++cnt]=u,nxt[cnt]=fir[v],fir[v]=cnt;}intf[MAXN][LOG],dep[MAXN],S[MAXN],T[MAXN],LCA[MAXN],Len[MAXN];voiddfs(intu,intff){dep[u]=dep[f[u][0]=ff]+1;for(inti=fir[u],v;i;i=nxt[i])if((v=to[i])!=ff)dfs(v,u);}inlineintlca(intx,inty){if(dep[x]>dep[y])swap(x,y);for(inti=LOG-1;~i;--i)if(dep[f[y][i]]>=dep[x])y=f[y][i];if(x==y)returnx;for(inti=LOG-1;~i;--i)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];returnf[x][0];}intt[2][MAXN<<1];vector<pair<int,int>>vec[MAXN];voidgetans(intu,intff){intpre[2]={t[0][w[u]+dep[u]],t[1][w[u]-dep[u]+MAXN]};for(inti=fir[u],v;i;i=nxt[i])if((v=to[i])!=ff)getans(v,u);for(inti=vec[u].size()-1;~i;--i)if(~vec[u][i].first)++t[vec[u][i].first][vec[u][i].second];ans[u]+=t[0][w[u]+dep[u]]-pre[0];ans[u]+=t[1][w[u]-dep[u]+MAXN]-pre[1];for(inti=vec[u].size()-1;~i;--i)if(vec[u][i].first==-1){intid=vec[u][i].second;--t[0][dep[S[id]]];--t[1][Len[id]-dep[T[id]]+MAXN];}}intmain(){scanf("%d%d",&n,&m);for(inti=1,x,y;i<n;++i)scanf("%d%d",&x,&y),link(x,y);for(inti=1;i<=n;++i)scanf("%d",&w[i]);dfs(1,0);for(intj=1;j<LOG;++j)for(inti=1;i<=n;++i)f[i][j]=f[f[i][j-1]][j-1];for(inti=1;i<=m;++i){scanf("%d%d",&S[i],&T[i]),LCA[i]=lca(S[i],T[i]);if(dep[S[i]]-dep[LCA[i]]==w[LCA[i]])--ans[LCA[i]];Len[i]=dep[S[i]]+dep[T[i]]-(dep[LCA[i]]<<1);vec[S[i]].push_back(pair<int,int>(0,dep[S[i]]));vec[T[i]].push_back(pair<int,int>(1,Len[i]-dep[T[i]]+MAXN));vec[LCA[i]].push_back(pair<int,int>(-1,i));}getans(1,0);for(inti=1;i<=n;++i)printf("%d%c",ans[i],"\n"[i==n]);}

普通会员

0

帖子

292

回复

298

积分
沙发
发表于 2019-12-20 22:26:30

很好

普通会员

0

帖子

289

回复

295

积分
板凳
发表于 2024-04-19 04:34:08

楼主你知道的太多了

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017