萌新刚学树剖,本地可以编译并运行,但交上去无法编译,求助
查看原帖
萌新刚学树剖,本地可以编译并运行,但交上去无法编译,求助
241413
Dixiky_215楼主2020/9/30 22:57
#include<bits/stdc++.h> 
using namespace std;
int n,q,cnt=0,head[550000],nxt[550000],to[550000],u,v;
int w[550000],ans;
int fa[550000],son[550000],dep[550000],size[550000];
int top[550000],dfn[550000],id[550000],l[550000],r[550000],tot=0;
int val1[550000],val2[550000],lazy[550000];
bool pd[550000];
char b[150];
inline void add(int x,int y)
{
	to[++cnt]=y;
	nxt[cnt]=head[x];
	head[x]=cnt;
}
inline void push_up(int x)
{
	val1[x]=val1[2*x]+val1[2*x+1];
	val2[x]=max(val2[2*x],val2[2*x+1]);
}
void build(int x,int li,int ri)
{
	int mid=(li+ri)>>1;
	l[x]=li;r[x]=ri;
	if(li==ri)
	{
		val1[x]=w[id[li]];val2[x]=w[id[li]];
		return;
	}
	build(2*x,li,mid);
	build(2*x+1,mid+1,ri);
	push_up(x);
}
void modify(int x,int loc,int vl)
{
	int mid=(l[x]+r[x])>>1;
	if(l[x]==r[x])
	{
		val1[x]=vl;val2[x]=vl;
		return;
	}
	if(loc<=mid)
	modify(x*2,loc,vl);
	else
	modify(x*2+1,loc,vl);
	push_up(x);
}
int ask1(int x,int li,int ri)
{
	int mid=(l[x]+r[x])>>1;
	if(li==l[x]&&ri==r[x])
	return val1[x];
	if(ri<=mid)
	return ask1(x*2,li,ri);
	else if(li>mid)
	return ask1(x*2+1,li,ri);
	else
	return ask1(x*2,li,mid)+ask1(x*2+1,mid+1,ri);
}
int ask2(int x,int li,int ri)
{
	int mid=(l[x]+r[x])>>1;
	if(li==l[x]&&ri==r[x])
	return val2[x];
	if(ri<=mid)
	return ask2(x*2,li,ri);
	else if(li>mid)
	return ask2(x*2+1,li,ri);
	else
	return max(ask2(x*2,li,mid),ask2(x*2+1,mid+1,ri));
}
void dfs1(int x)
{
	size[x]=1;pd[x]=1;
	for(int i=head[x];i;i=nxt[i])
	{
		int y=to[i];
		if(!pd[y])
		{
			fa[y]=x;dep[y]=dep[x]+1;
			dfs1(y);
			size[x]+=size[y];
			if(size[son[x]]<size[y])
			son[x]=y;
		}
	}
}
void dfs2(int x)
{
	if(x!=son[fa[x]])
	top[x]=x;
	else
	top[x]=top[fa[x]];
	tot++;dfn[x]=tot;id[tot]=x;
	if(son[x])
	dfs2(son[x]);
	for(int i=head[x];i;i=nxt[i])
	{
		int y=to[i];
		if(y!=fa[x]&&y!=son[x])
		dfs2(y);
	}
}
int qsum(int x,int y)
{
	int ret=0;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]>dep[top[y]])
		{
			ret+=ask1(1,dfn[top[x]],dfn[x]);x=fa[top[x]];
		}
		else
		{
			ret+=ask1(1,dfn[top[y]],dfn[y]);y=fa[top[y]];
		}
	}
	if(dep[x]>dep[y])
	ret+=ask1(1,dfn[y],dfn[x]);
	else
	ret+=ask1(1,dfn[x],dfn[y]);
	return ret;
}
long long int qmax(int x,int y)
{
	int ret=-1e9;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]>dep[top[y]])
		{
			ret=max(ret,ask2(1,dfn[top[x]],dfn[x]));x=fa[top[x]];
		}
		else
		{
			ret=max(ret,ask2(1,dfn[top[x]],dfn[x]));y=fa[top[y]];
		}
	}
	if(dep[x]>dep[y])
	ret=max(ret,ask2(1,dfn[y],dfn[x]));
	else
	ret=max(ret,ask2(1,dfn[x],dfn[y]));
	return ret;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n-1;i++)
	scanf("%d%d",&u,&v),add(u,v),add(v,u);
	for(int i=1;i<=n;i++) scanf("%d",&w[i]);
	dfs1(1);
	dfs2(1);
	build(1,1,tot);
	scanf("%d",&q);
	for(int i=1;i<=q;i++)
	{
		cin>>b;
		if(b[0]=='Q')
		{
			if(b[1]=='M')
			{
				scanf("%d%d",&u,&v);
				ans=qmax(u,v);
				printf("%d\n",ans);
			}
			else
			{
				scanf("%d%d",&u,&v);
				ans=qsum(u,v);
				printf("%d\n",ans);
			}
		}
		else
		{
			int vg;
			scanf("%d%d",&u,&vg);
			modify(1,dfn[u],vg);
		}
	}
	return 0;
}

2020/9/30 22:57
加载中...