[违规自杀] 呜呜呜!!!萌新做个树剖不容易啊!怎么还RE了呢?呜呜呜
查看原帖
[违规自杀] 呜呜呜!!!萌新做个树剖不容易啊!怎么还RE了呢?呜呜呜
230825
许多楼主2021/10/19 15:25

呜呜呜

呜哇,咳咳,呜呜呜

为什么一直RE!!!呜呜呜

洛谷!你为什么要这么对我!!啊~呜呜呜·

(这孩子调了4个小时调疯了)

#include<bits/stdc++.h>
#include<cstdio>
#define LL long long
using namespace std;
inline LL read(){
	LL 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*10+(ch-'0'),ch=getchar();
	return x*f;
}
LL n,m;
vector<LL>bian[200200][3];
LL siz[200200],son[200200],fa[200200],top[200200],dep[200200],a[200200],seg[200200],rev[200200],seg_size=0;
LL B[200200][3];
void dfs1(LL now,LL f,LL qz){
	dep[now]=dep[f]+1;fa[now]=f;siz[now]=1;a[now]=qz;
	LL l1=0;
	for(LL i=0;i<bian[now][0].size();i++)
		if(bian[now][0][i]!=f){
			dfs1(bian[now][0][i],now,bian[now][1][i]);
			siz[now]+=siz[bian[now][0][i]];
			if(siz[bian[now][0][i]]>l1)son[now]=bian[now][0][i],l1=siz[bian[now][0][i]];
		}
	return ;
}
void dfs2(LL now,LL Top){
	top[now]=Top;seg[now]=++seg_size;rev[seg_size]=now;
	if(son[now])dfs2(son[now],Top);
	for(LL i=0;i<bian[now][0].size();i++)
		if(bian[now][0][i]!=fa[now]&&bian[now][0][i]!=son[now])
			dfs2(bian[now][0][i],bian[now][0][i]);
	return;
}
LL sum[200300<<5][4],add[200300<<5],TNT=0;
void build(LL l,LL r,LL now){
	if(l==r){
		sum[now][0]=sum[now][1]=sum[now][2]=a[rev[++TNT]];return;
	}
	LL mid=(l+r)>>1;
	build(l,mid,now<<1);build(mid+1,r,now<<1|1);
	sum[now][0]=sum[now<<1][0]+sum[now<<1|1][0];
	sum[now][1]=max(sum[now<<1][1],sum[now<<1|1][1]);
	sum[now][2]=min(sum[now<<1][2],sum[now<<1|1][2]);
	return;
}
void Add(LL now){
	add[now]=add[now]==0? 1:0;
	swap(sum[now][1],sum[now][2]);
	sum[now][0]=0-sum[now][0];
	sum[now][1]=0-sum[now][1];
	sum[now][2]=0-sum[now][2];
}
void pushdown(LL now){
	if(add[now]==0)return;
	Add(now<<1);Add(now<<1|1);
	add[now]=0;
	return;
}
void Add2(LL now,LL v){
	sum[now][0]=sum[now][1]=sum[now][2]=v;
	return;
}
void modify(LL l,LL r,LL x,LL y,LL now){;
	if(l>=x&&r<=y)return Add(now);
	LL mid=(l+r)>>1;
	pushdown(now);
	if(x<=mid)modify(l,mid,x,y,now<<1);
	if(y>mid)modify(mid+1,r,x,y,now<<1|1);
	sum[now][0]=sum[now<<1][0]+sum[now<<1|1][0];
	sum[now][1]=max(sum[now<<1][1],sum[now<<1|1][1]);
	sum[now][2]=min(sum[now<<1][2],sum[now<<1|1][2]);
	return ;
}
void modify2(LL l,LL r,LL now,LL x,LL v){
	if(l==r&&l==x)return Add2(now,v);
	pushdown(now);
	LL mid=(l+r)>>1;
	if(x<=mid) modify2(l,mid,now<<1,x,v);
	if(x>mid) modify2(mid+1,r,now<<1|1,x,v);
	sum[now][0]=sum[now<<1][0]+sum[now<<1|1][0];
	sum[now][1]=max(sum[now<<1][1],sum[now<<1|1][1]);
	sum[now][2]=min(sum[now<<1][2],sum[now<<1|1][2]);
	return;
}
LL query(LL l,LL r,LL x,LL y,LL now,LL v){
	if(x<=l&&y>=r)return sum[now][v];
	LL mid=(l+r)>>1;
	pushdown(now);
	if(x<=mid&&y>=mid){
		if(v==0)return query(l,mid,x,y,now<<1,v)+query(mid+1,r,x,y,now<<1|1,v);
		if(v==1)return max(query(l,mid,x,y,now<<1,v),query(mid+1,r,x,y,now<<1|1,v));
		if(v==2)return min(query(l,mid,x,y,now<<1,v),query(mid+1,r,x,y,now<<1|1,v));
	}
	if(x<=mid&&y<=mid)	return query(l,mid,x,y,now<<1,v);
	return query(mid+1,r,x,y,now<<1|1,v);
}
int main(){
	n=read();
	for(LL i=1;i<n;i++){
		LL l1=read()+1,l2=read()+1,l3=read();
		B[i][0]=l1;B[i][1]=l2;
		bian[l1][0].push_back(l2);bian[l1][1].push_back(l3);
		bian[l2][0].push_back(l1);bian[l2][1].push_back(l3);
	}
	dep[1]=0;
	dfs1(1,1,0);
	dfs2(1,1);
	build(1,n,1);
	m=read();
	char ch;
	for(LL i=1;i<=m;i++){
		ch=getchar();
		while(ch<'A'||ch>'Z')ch=getchar();
		if(ch=='C'){
			LL l3=read(),l4=read();
			if(B[l3][0]==fa[B[l3][1]])swap(B[l3][0],B[l3][1]);
			modify2(1,n,1,seg[B[l3][0]],l4);
		}
		if(ch=='N'){
			LL l3=read()+1,l4=read()+1;
			while(top[l3]!=top[l4]){
				if(dep[top[l3]]<dep[top[l4]])swap(l3,l4);
				modify(1,n,seg[top[l3]],seg[l3],1);
				l3=fa[top[l3]];
			}
			if(dep[l3]>dep[l4])swap(l3,l4);
			modify(1,n,seg[l3],seg[l4],1);
		}
		if(ch=='S'){
			LL l3=read()+1,l4=read()+1,WSND=0;
			while(top[l3]!=top[l4]){
				if(dep[top[l3]]<dep[top[l4]])swap(l3,l4);
				WSND+=query(1,n,seg[top[l3]],seg[l3],1,0);
				l3=fa[top[l3]];
			}
			if(dep[l3]>dep[l4])swap(l3,l4);
			WSND+=query(1,n,seg[l3],seg[l4],1,0);
			printf("%lld\n",WSND);
		}
		if(ch=='M'){
			ch=getchar();
			if(ch=='A'){
				LL l3=read()+1,l4=read()+1,WSND=0;
				while(top[l3]!=top[l4]){
					if(dep[top[l3]]<dep[top[l4]])swap(l3,l4);
					WSND=max(WSND,query(1,n,seg[top[l3]],seg[l3],1,1));
					l3=fa[top[l3]];
				}
				if(dep[l3]>dep[l4])swap(l3,l4);
				WSND=max(WSND,query(1,n,seg[l3],seg[l4],1,1));
				printf("%lld\n",WSND);
			}
			else{
				LL l3=read()+1,l4=read()+1,WSND=0;
				while(top[l3]!=top[l4]){
					if(dep[top[l3]]<dep[top[l4]])swap(l3,l4);
					WSND=min(WSND,query(1,n,seg[top[l3]],seg[l3],1,2));
					l3=fa[top[l3]];
				}
				if(dep[l3]>dep[l4])swap(l3,l4);
				WSND=min(WSND,query(1,n,seg[l3],seg[l4],1,2));
				printf("%lld\n",WSND);
			}
		}	
	}
	return 0;
}

为啥,为啥样例没事啊!!!呜~

2021/10/19 15:25
加载中...