这题明显是个树,由于不能每次都对节点进行修改,可以树上差分进行维护,主要还是看代码吧,上代码:
//注:由于本人太懒了,不想用指针存树,就用邻接向量,再配合fa数组(由于我喜欢用unordered_map,此处为unordered_map)
#include<bits/stdc++.h>
#define int __int128
#define INT128_MAX ((__int128)1<<127)-1
inline __int128 read()
{
__int128 x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
{
f=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
inline void write(__int128 x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9)
{
write(x/10);
}
putchar(x%10+'0');
}
using namespace std;
unordered_map<int,vector<int>>g;
int n,t,nw,k,tot;
unordered_map<int,int>fa,u,v,sum,ans;
void dfs(int now)
{
for(int i=0;i<g[now].size();++i)
{
int x=g[now][i];
if(!fa[x])
{
fa[x]=now;
dfs(x);
}
}
}
void sdfs(int now,int s)
{
ans[now]+=s;
for(int i=0;i<g[now].size();++i)
{
int x=g[now][i];
if(fa[x]==now)
{
sdfs(x,s+sum[x]);
}
}
}
void add(int a,int b)
{
g[a].push_back(b);
g[b].push_back(a);
}
signed main()
{
n=read();
for(int i=1;i<n;++i)
{
u[i]=read(),v[i]=read();
add(u[i],v[i]);
}
fa[1]=1;
dfs(1);
int _=read();
while(_--)
{
t=read(),nw=read(),k=read();
if(t==1)
{
if(fa[u[nw]]==v[nw])
{
sum[u[nw]]+=k;
}
else
{
sum[1]+=k;
sum[v[nw]]-=k;
}
}
else
{
if(fa[v[nw]]==u[nw])
{
sum[v[nw]]+=k;
}
else
{
sum[1]+=k;
sum[u[nw]]-=k;
}
}
}
sdfs(1,sum[1]);
for(int i=1;i<=n;++i)
{
write(ans[i]);
puts("");
}
return 0;
}
文章介绍了在树结构中,通过邻接向量和fa数组实现差分维护,以高效处理节点修改操作,展示了dfs和sdfs函数的应用以及如何更新sum和ans变量。
1284

被折叠的 条评论
为什么被折叠?



