2 条题解

  • 0
    @ 2026-4-23 9:47:40

    • 0
      @ 2026-1-1 21:56:05
      #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
      上传者