LOJ #145求助
  • 板块学术版
  • 楼主ducati
  • 当前回复7
  • 已保存回复7
  • 发布时间2020/7/14 19:52
  • 上次更新2023/11/6 23:07:42
查看原帖
LOJ #145求助
87064
ducati楼主2020/7/14 19:52

本蒟蒻刚学dfsdfs序,懂了之后就开始练习了~刷到了这一题

这题做法显然,用dfsdfs序给各个节点编号,然后用线段树来维护一下即可。但是,本蒟蒻的后两个点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;
}
2020/7/14 19:52
加载中...