求助,莫名RE 0pts
查看原帖
求助,莫名RE 0pts
389729
BantM楼主2023/11/3 17:15

诸位不必看到较为复杂的代码就退出,程序样例过了 ,所以蒟蒻猜应该是个弱智的错误

#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define debug cout<<-1<<endl
const int maxn=2e5+5; 
const int inf=1001;
int n,m,uu,vv,ww;
string s;
int ii;
vector<int>q[maxn];
vector<int>val[maxn];
int fa[maxn],siz[maxn],dep[maxn],son[maxn],top[maxn];
int rnk[maxn],id[maxn];
int mi[4*maxn],ma[4*maxn],sum[4*maxn],a[maxn],tag[4*maxn];

inline int ls(int a){
	return 2*a;
}
inline int rs(int a){
	return 2*a+1;
}
inline void pushup(int a){
	ma[a]=max(ma[ls(a)],ma[rs(a)]);
	mi[a]=min(mi[ls(a)],mi[rs(a)]);
	sum[a]=sum[ls(a)]+sum[rs(a)];
	return;
}
void build(int l,int r,int p){
	tag[p]=1;
	if(l==r){
		mi[p]=rnk[l];
		ma[p]=rnk[l];
		sum[p]=rnk[l];
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,ls(p));
	build(mid+1,r,rs(p));
	pushup(p);
}
inline void f(int l,int r,int p,int k){
	tag[p]*=k;// 1 -1
	if(k==-1){
		sum[p]=-1*sum[p];
		int tem=ma[p];
		ma[p]=-1*mi[p];
		mi[p]=-1*tem;	
	}
	return;
}
void pushdown(int l,int r,int p){
	int mid=(l+r)/2;
	f(l,mid,ls(p),tag[p]);
	f(mid+1,r,rs(p),tag[p]);
	tag[p]=0;
	return ;
}
void change(int key,int l,int r,int p,int k){
	if(l==r&&r==key){
		tag[p]=1;
		sum[p]=k;
		ma[p]=k;
		mi[p]=k;
		return;
	}
	pushdown(l,r,p);
	int mid=(l+r)/2;
	if(mid>=key){
		change(key,l,mid,ls(p),k);
	}
	if(mid<key){
		change(key,mid+1,r,rs(p),k); 
	}
	pushup(p);
	return;
}
void turn(int nl,int nr,int l,int r,int p){
	int ret=0;
	if(nl<=l&&r<=nr){
		f(l,r,p,-1);
		return;
	}
	pushdown(l,r,p);
	int mid=(l+r)/2;
	if(mid>=nl){
		turn(nl,nr,l,mid,ls(p));
	}
	if(mid<nr){
		turn(nl,nr,mid+1,r,rs(p));
	}
	pushup(p);
	return;
}
int query(int nl,int nr,int l,int r,int p){
	int ret=0;
	if(nl<=l&&r<=nr){
		return sum[p];
	}
	pushdown(l,r,p);
	int mid=(l+r)/2;
	if(mid>=nl){
		ret+=query(nl,nr,l,mid,ls(p));
	}
	if(mid<nr){
		ret+=query(nl,nr,mid+1,r,rs(p));
	}
	return ret;
}
int askmax(int nl,int nr,int l,int r,int p){
	int ret=-inf;
	if(nl<=l&&r<=nr){
		return ma[p];
	}
	pushdown(l,r,p);
	int mid=(l+r)/2;
	if(mid>=nl){
		ret=max(ret,askmax(nl,nr,l,mid,ls(p)));
	}
	if(mid<nr){
		ret=max(ret,askmax(nl,nr,mid+1,r,rs(p)));
	}
	return ret;
}
int askmin(int nl,int nr,int l,int r,int p){
	int ret=inf;
	if(nl<=l&&r<=nr){
		return mi[p];
	}
	pushdown(l,r,p);
	int mid=(l+r)/2;
	if(mid>=nl){
		ret=min(ret,askmin(nl,nr,l,mid,ls(p)));
	}
	if(mid<nr){
		ret=min(ret,askmin(nl,nr,mid+1,r,rs(p)));
	}
	return ret;
}

void dfs1(int u,int last){
	dep[u]=dep[fa[u]]+1;
	siz[u]=1;
	for(int i=0;i<q[u].size();i++){
		int v=q[u][i];
		if(v!=fa[u]){
			fa[v]=u;
			dfs1(v,u);
			siz[u]+=siz[v];
			if(siz[son[u]]<siz[v]){
				son[u]=v;
			}
		}
	} 
}
int cnt=0;
void dfs2(int u,int tp){
	top[u]=tp;
	id[u]=++cnt;
	rnk[cnt]=u;
	if(son[u]){
		dfs2(son[u],tp);
	}
	for(int i=0;i<q[u].size();i++){
		int v=q[u][i];
		if(v!=fa[u]&&v!=son[u]){
			dfs2(v,v);
		} 
		
	}
	return;
}
void tur(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]>dep[top[y]]){
			swap(x,y);
		}
		turn(id[top[y]],id[y],1,n,1);
		y=fa[top[y]];
	}
	if(dep[x]>dep[y]){
		swap(x,y);
	}
	if(id[x]+1<=id[y]){
		turn(id[x]+1,id[y],1,n,1);	
	}
	return;
}
int ask1(int x,int y){
	int ret=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]>dep[top[y]]){
			swap(x,y);
		}
		ret+=query(id[top[y]],id[y],1,n,1);
		y=fa[top[y]];
	}
	if(dep[x]>dep[y]){
		swap(x,y);
	}
	if(id[x]+1<=id[y]){
		ret+=query(id[x]+1,id[y],1,n,1);	
	}
	return ret;
}
int ask2(int x,int y){
	int ret=-inf;
	while(top[x]!=top[y]){
		if(dep[top[x]]>dep[top[y]]){
			swap(x,y);
		}
		ret=max(ret,askmax(id[top[y]],id[y],1,n,1));
		y=fa[top[y]];
	}
	if(dep[x]>dep[y]){
		swap(x,y);
	}
	if(id[x]+1<=id[y]){
		ret=max(ret,askmax(id[x]+1,id[y],1,n,1));	
	}
	return ret;
}
int ask3(int x,int y){
	int ret=inf;
	while(top[x]!=top[y]){
		if(dep[top[x]]>dep[top[y]]){
			swap(x,y);
		}
		ret=min(ret,askmin(id[top[y]],id[y],1,n,1));
		y=fa[top[y]];
	}
	if(dep[x]>dep[y]){
		swap(x,y);
	}
	if(id[x]+1<=id[y]){
		ret=min(ret,askmin(id[x]+1,id[y],1,n,1));	
	}
	return ret;
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<=n-1;i++){
		scanf("%lld%lld%lld",&uu,&vv,&ww);
		q[uu].push_back(vv);
		val[uu].push_back(ww);
		q[vv].push_back(uu);
		val[vv].push_back(ww);
	}
    dfs1(1,0);
	dfs2(1,1);
	build(1,n,1);    
	scanf("%lld",&m);
	while(m--){
		cin>>s;
		if(s[0]=='C'){
			scanf("%lld%lld",&ii,&ww);
			change(id[ii],1,n,1,ww);
		}
		else if(s[0]=='N'){
			scanf("%lld%lld",&uu,&vv);
			tur(uu,vv);
		}
		else if(s[0]=='S'){
			scanf("%lld%lld",&uu,&vv);
			printf("%lld\n",ask1(uu,vv));
		}
		else if(s[0]=='M'&&s[1]=='A'){
			scanf("%lld%lld",&uu,&vv);
			printf("%lld\n",ask2(uu,vv));
		}
		else{
			scanf("%lld%lld",&uu,&vv);
			printf("%lld\n",ask3(uu,vv));
		}
	}
	return 0;
       
       
} 
2023/11/3 17:15
加载中...