树剖0分,help
查看原帖
树剖0分,help
365532
Mr_ll楼主2022/9/22 17:15

蒟蒻崩溃,蒟蒻大哭,调了2h没调出来

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define debug cout<<tr[5].sum<<endl;
using namespace std;
const int N=4e5+10;

int n,u[N],v[N],w[N],bs,hea[N],m,siz[N],son[N],dep[N],f[N],c[N],ww,ans,id[N];
int d,tim,top[N],rk[N],x,y,ca;

struct lll {
	int to,net,dis;
}lu[N];
struct qwe {
	int ma,mi,sum;
	bool tag;
}tr[N<<2];

char ch[10];

void jb(int a,int b,int c)
{
	lu[++bs].to=b;
	lu[bs].dis=c;
	lu[bs].net=hea[a];
	hea[a]=bs;
}

void dfs1(int x,int fa)
{
	dep[x]=dep[fa]+1;
	f[x]=fa;
	siz[x]=1;
	for(int i=hea[x];i;i=lu[i].net)
	{
		int y=lu[i].to;
		if(y==f[x]) continue;
		c[y]=lu[i].dis;
		dfs1(y,x);
		if(siz[y]>siz[son[x]]) son[x]=y;
		siz[x]+=siz[y];
	}
}

void dfs2(int x,int fa)
{
	id[x]=++tim;
	rk[tim]=c[x];
	top[x]=fa;
	if(son[x]) dfs2(son[x],fa);
	for(int i=hea[x];i;i=lu[i].net)
	{
		int y=lu[i].to;
		if(y==f[x]||y==son[x]) continue;
		dfs2(y,y);
	}
}

void push_up(int t)
{
	tr[t].sum=tr[t<<1].sum+tr[t<<1|1].sum;
	tr[t].ma=max(tr[t<<1].ma,tr[t<<1|1].ma);
	tr[t].mi=min(tr[t<<1].mi,tr[t<<1|1].mi); 
}

void biu(int t,int l,int r)
{
	if(l==r)
	{
		tr[t].ma=rk[l];
		tr[t].mi=rk[l];
		tr[t].sum=rk[l];
		return;
	}
	int mid=(l+r)>>1;
	biu(t<<1,l,mid);
	biu(t<<1|1,mid+1,r);
	push_up(t);
}

void push_down(int t)
{
	if(!tr[t].tag) return ;
	tr[t<<1].tag^=1;
	tr[t<<1|1].tag^=1;
		tr[t<<1].sum=0-tr[t<<1].sum;
		swap(tr[t<<1].ma,tr[t<<1].mi);
		tr[t<<1].ma=0-tr[t<<1].ma;
		tr[t<<1].mi=0-tr[t<<1].mi;
		tr[t<<1|1].sum=0-tr[t<<1|1].sum;
		swap(tr[t<<1|1].ma,tr[t<<1|1].mi);
		tr[t<<1|1].ma=0-tr[t<<1|1].ma;
		tr[t<<1|1].mi=0-tr[t<<1|1].mi;
	tr[t].tag=0;
}

void change(int t,int l,int r,int x,int z)
{
	if(l==r&&l==x)
	{
		tr[t].ma=z;
		tr[t].mi=z;
		tr[t].sum=z;
		return;
	}
	push_down(t);
	int mid=(l+r)>>1;
	if(x<=mid) change(t<<1,l,mid,x,z);
	if(x>mid) change(t<<1|1,mid+1,r,x,z);
	push_up(t);
}

void change2(int t,int l,int r,int x,int y)
{
	if(x<=l&&y>=r)
	{
		tr[t].tag^=1;
		tr[t].sum=0-tr[t].sum;
		swap(tr[t].ma,tr[t].mi);
		tr[t].ma=0-tr[t].ma;
		tr[t].mi=0-tr[t].mi;
		return;
	}
	push_down(t);
	int mid=(l+r)>>1;
	if(x<=mid) change2(t<<1,l,mid,x,y);
	if(y>mid) change2(t<<1|1,mid+1,r,x,y);
	push_up(t);
}

int sum(int t,int l,int r,int x,int y)
{
	if(x<=l&&y>=r) return tr[t].sum;
	int an=0;
	push_down(t);
	int mid=(l+r)>>1;
	if(x<=mid) an+=sum(t<<1,l,mid,x,y);
	if(y>mid) an+=sum(t<<1|1,mid+1,r,x,y);
	push_up(t);
	return an; 
}

int MA(int t,int l,int r,int x,int y)
{
	if(x<=l&&y>=r) return tr[t].ma;
	int an=-214748364;
	push_down(t);
	int mid=(l+r)>>1;
	if(x<=mid) an=max(an,MA(t<<1,l,mid,x,y));
	if(y>mid) an=max(an,MA(t<<1|1,mid+1,r,x,y));
	push_up(t);
	return an; 
}

int MI(int t,int l,int r,int x,int y)
{
	if(x<=l&&y>=r) return tr[t].mi;
	int an=214748364;
	push_down(t);
	int mid=(l+r)>>1;
	if(x<=mid) an=min(an,MA(t<<1,l,mid,x,y));
	if(y>mid) an=min(an,MA(t<<1|1,mid+1,r,x,y));
	push_up(t);
	return an; 
}

void cl2(int x,int y)
{
	while(top[x]!=top[y]) 
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		change2(1,1,n,id[top[x]],id[x]);
		x=f[top[x]];
	}
	if(id[x]>id[y]) swap(x,y);
	if(x==y) return;
	change2(1,1,n,id[x]+1,id[y]);
}

void cl3(int x,int y)
{
	ans=0;
	while(top[x]!=top[y]) 
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans+=sum(1,1,n,id[top[x]],id[x]);
		x=f[top[x]];
	}
	if(id[x]>id[y]) swap(x,y);
	if(x==y) return;
	ans+=sum(1,1,n,id[x]+1,id[y]);
	printf("%d\n",ans);
}

void cl4(int x,int y)
{
	ans=-214748367;
	while(top[x]!=top[y]) 
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans=max(ans,(1,1,n,id[top[x]],id[x]));
		x=f[top[x]];
	}
	if(id[x]>id[y]) swap(x,y);
	if(x==y) return;
	ans=max(ans,MA(1,1,n,id[x]+1,id[y]));
	printf("%d\n",ans);
}

void cl5(int x,int y)
{
	ans=214748364;
	while(top[x]!=top[y]) 
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans=min(ans,MI(1,1,n,id[top[x]],id[x]));
		x=f[top[x]];
	}
	if(id[x]>id[y]) swap(x,y);
	if(x==y) return;
	ans=min(ans,MI(1,1,n,id[x]+1,id[y]));
	printf("%d\n",ans);
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<n;i++)
	{
		scanf("%d%d%d",&u[i],&v[i],&w[i]);
		u[i]++,v[i]++;
		jb(u[i],v[i],w[i]);
		jb(v[i],u[i],w[i]);
	}
	dfs1(1,0);
	dfs2(1,1);
	biu(1,1,n);
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%s",ch);
		if(ch[0]=='C')
		{
			scanf("%d%d",&x,&ww);
			y=v[x];x=u[x];
			if(id[x]>id[y]) swap(x,y);
			change(1,1,n,id[y],ww);
		}
		else if(ch[0]=='N')
		{
			scanf("%d%d",&x,&y);
			x++,y++;
			cl2(x,y);
		}
		else if(ch[0]=='S')
		{
			scanf("%d%d",&x,&y);
			x++;y++;
			cl3(x,y);
		}
		else if(ch[1]=='A')
		{
			scanf("%d%d",&x,&y);
			x++;y++;
			cl4(x,y);
		}
		else if(ch[1]=='I')
		{
			scanf("%d%d",&x,&y);
			x++;y++;
			cl5(x,y);
		}
	}
	return 0;
}
2022/9/22 17:15
加载中...