萌新刚学树剖,求调RE
查看原帖
萌新刚学树剖,求调RE
358739
BFSDFS123楼主2022/1/25 20:36

rt

目测不是数组大小的问题

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
//#define LL_inf 1145141919810
#define ull unsigned long long
#define ll long long
using namespace std;
#define int long long
const int Maxn=5e5+10;

int head[Maxn],tot;
struct Edge{
	int to;
	int nxt;
}E[Maxn<<1];
void addedge(int u,int v)
{
	tot++;
	E[tot].to=v;
	E[tot].nxt=head[u];
	head[u]=tot;
}
int n;
int dep[Maxn],siz[Maxn],fa[Maxn],son[Maxn],tp[Maxn],dfn[Maxn],cnt;
void dfs1(int u,int f)
{
	dep[u]=dep[f]+1;
	siz[u]=1;
	fa[u]=f;
	int maxson=-1;
	for(int i=head[u];i!=-1;i=E[i].nxt)
	{
		int v=E[i].to;
		if(v!=f)
		{
			dfs1(v,u);
			siz[u]+=siz[v];
			if(maxson<siz[v])
			{
				maxson=siz[v];
				son[u]=v;
			}
		}
	}
}
void dfs2(int u,int Top)
{
	tp[u]=Top;
	dfn[u]=++cnt;
	if(!son[u])
	{
		return ;
	}
	dfs2(son[u],Top);
	for(int i=head[u];i!=-1;i=E[i].nxt)
	{
		int v=E[i].to;
		if(v==fa[u] || v==son[u])
		{
			return ;
		}
		dfs2(v,v);
	}
}
struct SegTree{
	#define ls (node<<1)
	#define rs (node<<1|1)
	int tag[Maxn<<2];
	int sum[Maxn<<2];
	void pushup(int node)
	{
		sum[node]=sum[ls]+sum[rs];
	}
	void pushdown(int node,int l,int r)
	{
		if(tag[node]!=0)
		{
			int len=r-l+1;
			tag[ls]+=tag[node];
			sum[ls]+=tag[node]*(len-(len>>1));
			tag[rs]+=tag[node];
			sum[rs]+=tag[node]*(len>>1);
			tag[node]=0;
		}
	}
	void build(int node,int l,int r)
	{
		if(l==r)
		{
			sum[node]=0;
			return ;
		}
		int mid=(l+r)>>1;
		build(ls,l,mid);
		build(rs,mid+1,r);
		pushup(node);
	}
	void update(int node,int l,int r,int qL,int qR,int val)
	{
		if(qL<=l && r<=qR)
		{
			sum[node]+=(r-l+1)*val;
			tag[node]+=val;
			return ;
		}
		int mid=(l+r)>>1;
		pushdown(node,l,r); 
		if(qL<=mid) update(ls,l,mid,qL,qR,val);
		if(qR>mid) update(rs,mid+1,r,qL,qR,val);
		pushup(node);
	}
	int query(int node,int l,int r,int qL,int qR)
	{
		if(qL<=l && r<=qR)
		{
			return sum[node];
		}
		int mid=(l+r)>>1;
		int res=0;
		pushdown(node,l,r);
		if(qL<=mid) res+=query(ls,l,mid,qL,qR);
		if(qR>mid) res+=query(rs,mid+1,r,qL,qR);
		return res;
	}
}segtree;
int querysubtree(int u)
{
	return segtree.query(1,1,n,dfn[u],dfn[u]+siz[u]-1);
}
void modifyEdge(int u,int v,int val)
{
	while(tp[u]!=tp[v])
	{
		if(dep[tp[u]]<dep[tp[v]])
		{
			swap(u,v);
		}
		segtree.update(1,1,n,dfn[tp[u]],dfn[u],val);
		u=fa[tp[u]];
	}
	if(dep[u]>dep[v])
	{
		swap(u,v);
	}
	segtree.update(1,1,n,dfn[u],dfn[v],val);
}
signed main()
{
	memset(head,-1,sizeof(head));
	scanf("%lld",&n);
	for(int i=1;i<n;i++)
	{
		int u,v;
		scanf("%lld%lld",&u,&v);
		u++,v++;
		addedge(u,v);
		addedge(v,u);
	}
	dfs1(1,0);
	dfs2(1,1);
//	for(int i=1;i<=n;i++)
//	{
//		cout<<i<<":"<<dfn[i]<<" "<<siz[i]<<endl;
//	}
	segtree.build(1,1,n);
	int Q;
	scanf("%lld",&Q);
	while(Q--)
	{
		char opt[2];
		scanf("%s",&opt);
		if(opt[0]=='A')
		{
			int u,v,d;
			scanf("%lld%lld%lld",&u,&v,&d);
			u++,v++; 
			modifyEdge(u,v,d); 
		}else{
			int u;
			scanf("%lld",&u);
			u++;
			printf("%lld\n",querysubtree(u));
		}
	}
	return 0;
}

2022/1/25 20:36
加载中...