求助树剖全tle,下载数据本地wa了QwQ
查看原帖
求助树剖全tle,下载数据本地wa了QwQ
467906
Anyakwi楼主2022/10/28 10:55
#include<bits/stdc++.h>
using namespace std;
#define mid ((l+r)>>1)
#define lson x<<1,l,mid
#define rson x<<1|1,mid+1,r

inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*f;
}

const int maxn=2e5+5;
int n,m,cnt;
int head[maxn],to[maxn<<1],pre[maxn<<1],val[maxn<<1];

struct node
{
	int x,y,z;
}e[maxn];

void link(int a,int b,int c)
{
	to[++cnt]=b;
	pre[cnt]=head[a];
	head[a]=cnt;
	val[cnt]=c;
}

int dep[maxn],siz[maxn],son[maxn],fa[maxn],a[maxn];
void dfs1(int x,int fath,int deep)
{
	dep[x]=deep,fa[x]=fath,siz[x]=1;
	for(int i=head[x];i;i=pre[i])
	{
		int y=to[i];
		if(y!=fath)
		{
			dfs1(y,x,deep+1);
			siz[x]+=siz[y];
			if(siz[y]>siz[son[x]]) son[x]=y;
		}
	}
}

int tim;
int dfn[maxn],tp[maxn];
void dfs2(int x,int top)
{
	dfn[x]=++tim,tp[x]=top;
	if(!son[x]) return;
	dfs2(son[x],top);
	for(int i=head[x];i;i=pre[i])
	{
		int y=to[i];
		if(y!=fa[x]&&y!=son[x]) dfs2(y,y); 
	}
}

int t[maxn<<2],lz[maxn<<2],maxx[maxn<<2],minn[maxn<<2];

inline void up(int x)
{
	t[x]=t[x<<1]+t[x<<1|1];
	maxx[x]=max(maxx[x<<1],maxx[x<<1|1]);
	minn[x]=min(minn[x<<1],minn[x<<1|1]);
}

inline void down(int x,int l,int r)
{
	lz[x]=0;
	lz[x<<1]^=1,lz[x<<1|1]^=1;
	
	t[x<<1]=-t[x<<1],t[x<<1|1]=-t[x<<1|1];
	minn[x<<1]=-minn[x<<1],minn[x<<1|1]=-minn[x<<1|1];
	maxx[x<<1]=-maxx[x<<1],maxx[x<<1|1]=-maxx[x<<1|1];
	
	swap(minn[x<<1],maxx[x<<1]);
	swap(minn[x<<1|1],maxx[x<<1|1]);
} 

void build(int x,int l,int r)
{
	if(l==r)
	{
		t[x]=minn[x]=maxx[x]=a[l];
		return;
	}
	build(lson),build(rson);
	up(x);
}

void add(int x,int l,int r,int ql,int qr,int k)
{
//	cout<<l<<" "<<r<<" "<<maxx[x]<<endl;
	if(ql>r||qr<l) return;
	if(ql<=l&&r<=qr)
	{
		t[x]=minn[x]=maxx[x]=k;
		return;
	}
	if(lz[x]) down(x,l,r);
	add(lson,ql,qr,k),add(rson,ql,qr,k);
	up(x);
}

void mul(int x,int l,int r,int ql,int qr)
{
	if(ql>r||qr<l) return;
	if(ql<=l&&r<=qr)
	{
		t[x]=-t[x];
		minn[x]=-minn[x],maxx[x]=-maxx[x];
		swap(minn[x],maxx[x]);
		lz[x]^=1;
		return;
	}
	if(lz[x]) down(x,l,r);
	mul(lson,ql,qr),mul(rson,ql,qr);
	up(x);
}

int qsum(int x,int l,int r,int ql,int qr)
{
	if(ql>r||qr<l) return 0;
	if(ql<=l&&r<=qr) return t[x];
	if(lz[x]) down(x,l,r);
	return qsum(lson,ql,qr)+qsum(rson,ql,qr);
}

int qmax(int x,int l,int r,int ql,int qr)
{
//	cout<<l<<" "<<r<<" "<<maxx[x]<<endl;
	if(ql>r||qr<l) return 0;
	if(ql<=l&&r<=qr) return maxx[x];
	if(lz[x]) down(x,l,r);
//	cout<<l<<" "<<r<<" "<<qmax(lson,ql,qr)<<" "<<qmax(rson,ql,qr)<<endl;
	return max(qmax(lson,ql,qr),qmax(rson,ql,qr));
}

int qmin(int x,int l,int r,int ql,int qr)
{
	if(ql>r||qr<l) return 0;
	if(ql<=l&&r<=qr) return minn[x];
	if(lz[x]) down(x,l,r);
	return min(qmin(lson,ql,qr),qmin(rson,ql,qr));
}

void tadd(int x,int y,int k)
{
	while(tp[x]!=tp[y])
	{
		if(dep[tp[x]]<dep[tp[y]]) swap(x,y);
		add(1,1,n,dfn[tp[x]],dfn[x],k);
		x=fa[tp[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	add(1,1,n,dfn[x]+1,dfn[y],k);
}

void tmul(int x,int y)
{
	while(tp[x]!=tp[y])
	{
		if(dep[tp[x]]<dep[tp[y]]) swap(x,y);
		mul(1,1,n,dfn[tp[x]],dfn[x]);
		x=fa[tp[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	mul(1,1,n,dfn[x]+1,dfn[y]);
}

int tsum(int x,int y)
{
	int res=0;
	while(tp[x]!=tp[y])
	{
		if(dep[tp[x]]<dep[tp[y]]) swap(x,y);
		res+=qsum(1,1,n,dfn[tp[x]],dfn[x]);
		x=fa[tp[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
//	cout<<dfn[x]+1<<" "<<dfn[y]<<endl;
	res+=qsum(1,1,n,dfn[x]+1,dfn[y]);
}

int tmax(int x,int y)
{
	int res=INT_MIN;
	while(tp[x]!=tp[y])
	{
		if(dep[tp[x]]<dep[tp[y]]) swap(x,y);
		res=max(res,qmax(1,1,n,dfn[tp[x]],dfn[x]));
		x=fa[tp[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
//	cout<<dfn[x]+1<<" "<<dfn[y]<<endl;
	res=max(res,qmax(1,1,n,dfn[x]+1,dfn[y]));
	return res;
}

int tmin(int x,int y)
{
	int res=INT_MAX;
	while(tp[x]!=tp[y])
	{
		if(dep[tp[x]]<dep[tp[y]]) swap(x,y);
		res=min(res,qmin(1,1,n,dfn[tp[x]],dfn[x]));
		x=fa[tp[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	res=min(res,qmin(1,1,n,dfn[x]+1,dfn[y]));
	return res;
}

int main()
{
//	freopen("P1505_1.in","r",stdin);
	
	n=read();
	for(int i=1;i<n;i++)
	{
		int u=read()+1,v=read()+1,w=read();
		link(u,v,w),link(v,u,w);
		e[i].x=u,e[i].y=v,e[i].z=w;
	}
	
	dfs1(1,0,0);
	dfs2(1,1);
	
	for(int i=1;i<n;i++)
	{
		int x=e[i].x,y=e[i].y;
		if(dep[x]>dep[y]) swap(x,y),swap(e[i].x,e[i].y);
		a[dfn[y]]=e[i].z;
	}
	
	build(1,1,n);
	
	m=read();
	for(int i=1;i<=m;i++)
	{
		char s[10];
		scanf("%s",s);
		int x=read(),y=read();
		if(s[0]=='C')
		{
			int v=e[x].y;
			e[x].z=y;
			add(1,1,n,dfn[v],dfn[v],y);
		}
		x++,y++;
		if(s[0]=='N') tmul(x,y);
		
		if(s[0]=='S') printf("%d\n",tsum(x,y));
		
		if(s[1]=='A') printf("%d\n",tmax(x,y));
		
		if(s[1]=='I') printf("%d\n",tmin(x,y));
		
//		for(int j=1;j<=n;j++) cout<<qsum(1,1,n,j,j)<<" ";cout<<endl;
		
	}
	
	return 0;
}
/*

3
0 1 1
1 2 2
8
N 0 1
MIN 0 2
C 1 3
SUM 0 2
MAX 0 2

*/
2022/10/28 10:55
加载中...