全部WA求助
查看原帖
全部WA求助
866613
sansesantongshun楼主2024/1/18 21:20

我太南(cai)了。。。

#include<bits/stdc++.h>
using namespace std;
int n,m,a[200005],x,y,z,head[200005],cnt0=0,p[400005],b[200005],c[200005],d[200005],e[200005],cnt=0,f[200005],g[200005],h[200005];
long long aa[800005][3],ans;
bool bb[800005];
string s;
struct node
{
	int id,next,to,dis;
} edge[400005];
void add(int from,int to,int dis)
{
	++cnt0;
	edge[cnt0]=(node){cnt0,head[from],to,dis};
	head[from]=cnt0;
}
void dfs1(int x,int f)
{
	int y,maxn=0;
	b[x]=f;
	c[x]=c[f]+1;
	d[x]=1;
	for (int i=head[x];i;i=edge[i].next)
	{
		y=edge[i].to;
		if (y!=f)
		{
			a[y]=edge[i].dis;
			p[edge[i].id]=y;
			dfs1(y,x);
			d[x]+=d[y];
			if (d[y]>maxn)
			{
				maxn=d[y];
				e[x]=y;
			}
		}
	}
}
void dfs2(int x,int t)
{
	int y;
	f[x]=++cnt;
	g[cnt]=a[x];
	h[x]=t;
	if (e[x])
	{
		dfs2(e[x],t);
		for (int i=head[x];i;i=edge[i].next)
		{
			y=edge[i].to;
			if (y!=b[x] && y!=e[x])
			dfs2(y,y);
		}
	}
}
void build(int x,int l,int r)
{
	if (l==r)
	for (int i=0;i<3;++i)
	aa[x][i]=g[l];
	else
	{
		int mid=l+r>>1;
		build(x<<1,l,mid);
		build(x<<1|1,mid+1,r);
		aa[x][0]=max(aa[x<<1][0],aa[x<<1|1][0]);
	    aa[x][1]=aa[x<<1][1]+aa[x<<1|1][1];
		aa[x][2]=min(aa[x<<1][2],aa[x<<1|1][2]);
	}
}
void modify1(int x,int bl,int br,int y,int z)
{
	if (bl==br)
	for (int i=0;i<3;++i)
	aa[x][i]=z;
	else
	{
	    int mid=bl+br>>1;
	    if (bb[x])
	    {
	    	for (int i=0;i<3;++i)
	    	{
	    		aa[x<<1][i]=-aa[x<<1][i];
	    		aa[x<<1|1][i]=-aa[x<<1|1][i];
			}
	    	swap(aa[x<<1][0],aa[x<<1][2]);
	    	swap(aa[x<<1|1][0],aa[x<<1|1][2]);
    		bb[x<<1]^=1;
	    	bb[x<<1|1]^=1;
	    	bb[x]=0;
		}
	    if (y<=mid)
	    modify1(x<<1,bl,mid,y,z);
	    else
	    modify1(x<<1|1,mid+1,br,y,z);
	    aa[x][0]=max(aa[x<<1][0],aa[x<<1|1][0]);
	    aa[x][1]=aa[x<<1][1]+aa[x<<1|1][1];
		aa[x][2]=min(aa[x<<1][2],aa[x<<1|1][2]);
	}
}
void modify2(int x,int bl,int br,int l,int r)
{
	if (l<=bl && bl<=r)
	{
		for (int i=0;i<3;++i)
		aa[x][i]=-aa[x][i];
		bb[x]^=1;
	}
	else
	{
		int mid=bl+br>>1;
	    if (bb[x])
	    {
	    	for (int i=0;i<3;++i)
	    	{
	    		aa[x<<1][i]=-aa[x<<1][i];
	    		aa[x<<1|1][i]=-aa[x<<1|1][i];
			}
	    	swap(aa[x<<1][0],aa[x<<1][2]);
	    	swap(aa[x<<1|1][0],aa[x<<1|1][2]);
    		bb[x<<1]^=1;
	    	bb[x<<1|1]^=1;
	    	bb[x]=0;
		}
		if (l<=mid)
	    modify2(x<<1,bl,mid,l,r);
	    if (mid<r)
	    modify2(x<<1|1,mid+1,br,l,r);
	    aa[x][0]=max(aa[x<<1][0],aa[x<<1|1][0]);
	    aa[x][1]=aa[x<<1][1]+aa[x<<1|1][1];
		aa[x][2]=min(aa[x<<1][2],aa[x<<1|1][2]);
	}
}
long long query(int x,int bl,int br,int l,int r,int k)
{
	if (l<=bl && br<=r)
	return aa[x][k];
	int mid=bl+br>>1;
	long long result=(k-1)*0x7fffffffffffffff;
	if (bb[x])
	{
	    for (int i=0;i<3;++i)
	    {
	    	aa[x<<1][i]=-aa[x<<1][i];
	    	aa[x<<1|1][i]=-aa[x<<1|1][i];
		}
	    swap(aa[x<<1][0],aa[x<<1][2]);
	    swap(aa[x<<1|1][0],aa[x<<1|1][2]);
    	bb[x<<1]^=1;
	    bb[x<<1|1]^=1;
	    bb[x]=0;
	}
	if (l<=mid)
	{
		if (k==0)
		result=max(result,query(x<<1,bl,mid,l,r,k));
		else if (k==1)
		result+=query(x<<1,bl,mid,l,r,k);
		else
		result=min(result,query(x<<1,bl,mid,l,r,k));
	}
	if (mid<r)
	{
		if (k==0)
		result=max(result,query(x<<1|1,mid+1,br,l,r,k));
		else if (k==1)
		result+=query(x<<1|1,mid+1,br,l,r,k);
		else
		result=min(result,query(x<<1|1,mid+1,br,l,r,k));
	}
	return result;
}
int main()
{
	cin>>n;
	for (int i=1;i<n;++i)
	{
		scanf("%d%d%d",&x,&y,&z);
		++x;
		++y;
		add(x,y,z);
		add(y,x,z);
	}
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	cin>>m;
	while (m--)
	{
		cin>>s;
		scanf("%d%d",&x,&y);
		++x;
		++y;
		if (s=="C")
		modify1(1,1,n,f[p[x-1]],y-1);
		else if (s=="N")
		{
			while (h[x]!=h[y])
			{
				if (c[h[x]]<c[h[y]])
				swap(x,y);
				modify2(1,1,n,f[h[x]],f[x]);
				x=b[h[x]];
			}
			if (c[x]>c[y])
			swap(x,y);
			modify2(1,1,n,f[x]+1,f[y]);
		}
		else if (s=="SUM")
		{
			ans=0;
			while (h[x]!=h[y])
			{
				if (c[h[x]]<c[h[y]])
				swap(x,y);
				ans+=query(1,1,n,f[h[x]],f[x],1);
				x=b[h[x]];
			}
			if (c[x]>c[y])
			swap(x,y);
			if (x<y)
			ans+=query(1,1,n,f[x]+1,f[y],1);
			cout<<ans<<'\n';
		}
		else if (s=="MAX")
		{
			ans=-0x8000000000000000;
			while (h[x]!=h[y])
			{
				if (c[h[x]]<c[h[y]])
				swap(x,y);
				ans=max(ans,query(1,1,n,f[h[x]],f[x],0));
				x=b[h[x]];
			}
			if (c[x]>c[y])
			swap(x,y);
			if (x<y)
			ans=max(ans,query(1,1,n,f[x]+1,f[y],0));
			cout<<ans<<'\n';
		}
		else
		{
			ans=0x7fffffffffffffff;
			while (h[x]!=h[y])
			{
				if (c[h[x]]<c[h[y]])
				swap(x,y);
				ans=min(ans,query(1,1,n,f[h[x]],f[x],2));
				x=b[h[x]];
			}
			if (c[x]>c[y])
			swap(x,y);
			if (x<y)
			ans=min(ans,query(1,1,n,f[x]+1,f[y],2));
			cout<<ans<<'\n';
		}
	}
}
2024/1/18 21:20
加载中...