本蒟蒻刚学dfs序,懂了之后就开始练习了~刷到了这一题。
这题做法显然,用dfs序给各个节点编号,然后用线段树来维护一下即可。但是,本蒟蒻的后两个点WA了QWQ,有没有人帮帮本蒟蒻啊QAQ
WA CODE
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxlen=1000;
int n,q,r,cnt=0,x,u,v,A,opt,len=0;
int head[maxlen+5],dfs_list[maxlen+5],size[maxlen+5],tree[4*maxlen+5],w[maxlen+5],a[maxlen+5],tag[maxlen+5];
struct edge
{
int next;
int to;
}e[2*maxlen+5];
inline void add_edge(int u,int v)
{
cnt++;
e[cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
}
inline int read()
{
int s=0,w=1;
char ch=getchar();
while (ch<'0'||ch>'9')
{
if (ch=='-') w=-w;
ch=getchar();
}
while (ch>='0'&&ch<='9')
{
s=(s<<1)+(s<<3)+(ch^'0');
ch=getchar();
}
return s*w;
}
inline void dfs(int now,int fath)
{
len++;
dfs_list[now]=len;
size[now]=1;
for (int i=head[now];i;i=e[i].next)
{
if (e[i].to!=fath)
{
dfs(e[i].to,now);
size[now]+=size[e[i].to];
}
}
}
inline void pushup(int rt)
{
tree[rt]=tree[2*rt]+tree[2*rt+1];
}
inline void build_tree(int l,int r,int rt)
{
if (l==r)
{
tree[rt]=a[l];
return;
}
int mid=(l+r)>>1;
build_tree(l,mid,2*rt);
build_tree(mid+1,r,2*rt+1);
pushup(rt);
}
inline void f(int l,int r,int rt,int k)
{
tree[rt]+=(r-l+1)*k;
tag[rt]+=k;
}
inline void pushdown(int l,int r,int rt)
{
int mid=(l+r)>>1;
f(l,mid,2*rt,tag[rt]);
f(mid+1,r,2*rt+1,tag[rt]);
tag[rt]=0;
}
inline void change(int nl,int nr,int l,int r,int rt,int k)
{
if (nl<=l&&r<=nr)
{
f(l,r,rt,k);
return;
}
pushdown(l,r,rt);
int mid=(l+r)>>1;
if (nl<=mid) change(nl,nr,l,mid,2*rt,k);
if (nr>mid) change(nl,nr,mid+1,r,2*rt+1,k);
pushup(rt);
}
inline int query(int nl,int nr,int l,int r,int rt)
{
int mid=(l+r)>>1,sumv=0;
pushdown(l,r,rt);
if (nl<=l&&r<=nr) return tree[rt];
if (nl<=mid) sumv+=query(nl,nr,l,mid,2*rt);
if (nr>mid) sumv+=query(nl,nr,mid+1,r,2*rt+1);
return sumv;
}
signed main()
{
n=read(),q=read(),r=read();
for (int i=1;i<=n;i++) w[i]=read();
for (int i=1;i<n;i++)
{
u=read(),v=read();
add_edge(u,v);
add_edge(v,u);
}
dfs(r,0);
for (int i=1;i<=n;i++) a[dfs_list[i]]=w[i];
build_tree(1,n,1);
while (q--)x
{
opt=read();
if (opt==1)
{
A=read(),x=read();
change(dfs_list[A],dfs_list[A]+size[A]-1,1,n,1,x);
}
else
{
A=read();
cout<<query(dfs_list[A],dfs_list[A]+size[A]-1,1,n,1)<<endl;
}
}
return 0;
}