2 条题解
-
0
#include<bits/stdc++.h> using namespace std; #define int long long const int N=2e5+10; #define PII pair<int,int> #define fi first #define se second vector<PII>G[N];vector<int>vec[N]; map<int,int>dis[N]; int siz[N],del[N]; int rtmx,rt,all,cnt,n,m; void getrt(int x,int f) { siz[x]=1;int mx=0; for(auto i:G[x])if(i.fi!=f&&!del[i.fi]) { int y=i.fi; getrt(y,x); siz[x]+=siz[y]; mx=max(mx,siz[y]); } mx=max(mx,all-siz[x]); if(mx<rtmx)rtmx=mx,rt=x; } void getdis(int x,int f,int w) { dis[rt][x]=w;siz[x]=1; for(auto i:G[x])if(i.fi!=f&&!del[i.fi]) { int y=i.fi; getdis(y,x,w+i.se); siz[x]+=siz[y]; } } int fa[N],pre[N]; void divide(int x) { del[x]=1; getdis(x,0,0); for(auto i:G[x])if(!del[i.fi]) { int y=i.fi; all=rtmx=siz[y]; getrt(y,0); vec[x].push_back(rt); fa[rt]=x;pre[rt]=y; divide(rt); } } int sum[N],sumd[N],sumf[N]; void change(int x,int y) { for(int i=x;i;i=fa[i]) { sum[i]+=y; sumd[i]+=dis[i][x]*y; if(fa[i])sumf[i]+=dis[fa[i]][x]*y; } } int get(int x) { int res=sumd[x]; for(int i=x;fa[i];i=fa[i]) res+=sumd[fa[i]]-sumf[i]+dis[fa[i]][x]*(sum[fa[i]]-sum[i]); return res; } int query(int x) { int res=get(x); for(int y:vec[x]) { int s=get(pre[y]); if(s<res)return query(y); } return res; } signed main() { cin>>n>>m; for(int i=1;i<n;i++) { int x,y,w;cin>>x>>y>>w; G[x].push_back({y,w}); G[y].push_back({x,w}); } all=rtmx=n;getrt(1,0);int rrt=rt; divide(rt); while(m--) { int x,y;cin>>x>>y; change(x,y); cout<<query(rrt)<<'\n'; } return 0; }
- 1
信息
- ID
- 5589
- 时间
- 6000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 2
- 上传者
