蒟蒻只AC#11 求调。
查看原帖
蒟蒻只AC#11 求调。
656765
STARSczy楼主2024/3/17 16:59

rt,调处来左边的同学和左边的左边的同学和右边的同学吃键盘。

#include<bits/stdc++.h>
#define int long long
#define rep(i,l,r) for(int i=(l),i##end=(r);i<=i##end;++i)
#define per(i,r,l) for(int i=(r),i##end=(l);i>=i##end;--i)
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
const int maxn=1e5+10,maxm=1e6+10,mod=998244353;

int n,q,idtt,eu[maxn],ev[maxn],ew[maxn],dep[maxn],sz[maxn],fa[maxn],hs[maxn],lt[maxn],id[maxn];
int val[maxn],tmp[maxn],tn[maxn<<2],mx[maxn<<2],mn[maxn<<2],sm[maxn<<2];
vector<pii> e[maxn];
void dfs1(int u){
	sz[u]=1;
	for(auto &[v,w]:e[u]) if(v!=fa[u]){
		fa[v]=u,val[v]=w,dep[v]=dep[u]+1,dfs1(v),sz[u]+=sz[v];
		if(sz[v]>sz[hs[u]]) hs[u]=v;
	}
}
void dfs2(int u){
	if(!lt[u]) lt[u]=u;
	lt[hs[u]]=lt[u],tmp[id[u]=++idtt]=val[u];
	if(hs[u]) dfs2(hs[u]);
	for(auto &[v,w]:e[u]) if(v!=fa[u]&&v!=hs[u]) dfs2(v);
}

inline void down(int id){
	if(tn[id])
		swap(mx[id],mn[id]),mx[id]=-mx[id],mn[id]=-mn[id],sm[id]=-sm[id],
		tn[id<<1]^=1,tn[id<<1|1]^=1,tn[id]=0;
}
inline void pushup(int id){
	down(id<<1),down(id<<1|1),mx[id]=max(mx[id<<1],mx[id<<1|1]),
	mx[id]=min(mx[id<<1],mx[id<<1|1]),sm[id]=sm[id<<1]+sm[id<<1|1];}
void build(int id,int l,int r,int *tmp){
	if(l==r){
		mx[id]=mn[id]=sm[id]=tmp[l];
		return;
	}
	int mid=l+r>>1;
	build(id<<1,l,mid,tmp),build(id<<1|1,mid+1,r,tmp),pushup(id);
}
void change(int id,int l,int r,int k,int x){
	down(id);
	if(l==r){
		mx[id]=mn[id]=sm[id]=x;
		return;
	}
	int mid=l+r>>1;
	if(k<=mid) change(id<<1,l,mid,k,x);
	else change(id<<1|1,mid+1,r,k,x);
	pushup(id);
}
void mk(int id,int l,int r,int lq,int rq){
	down(id);
	if(lq<=l&&r<=rq){
		tn[id]^=1;
		return;
	}
	int mid=l+r>>1;
	if(lq<=mid) mk(id<<1,l,mid,lq,rq);
	if(rq>mid) mk(id<<1|1,mid+1,r,lq,rq);
	pushup(id);
}
int sum(int id,int l,int r,int lq,int rq){
	down(id);
	if(lq<=l&&r<=rq) return mx[id];
	int mid=l+r>>1,ans=0;
	if(lq<=mid) ans+=sum(id<<1,l,mid,lq,rq);
	if(rq>mid) ans+=sum(id<<1|1,mid+1,r,lq,rq);
	return ans;
}
int qmax(int id,int l,int r,int lq,int rq){
	down(id);
	if(lq<=l&&r<=rq) return mx[id];
	int mid=l+r>>1,ans=INT_MIN;
	if(lq<=mid) ans=max(ans,qmax(id<<1,l,mid,lq,rq));
	if(rq>mid) ans=max(ans,qmax(id<<1|1,mid+1,r,lq,rq));
	return ans;
}
int qmin(int id,int l,int r,int lq,int rq){
	down(id);
	if(lq<=l&&r<=rq) return mx[id];
	int mid=l+r>>1,ans=INT_MAX;
	if(lq<=mid) ans=min(ans,qmin(id<<1,l,mid,lq,rq));
	if(rq>mid) ans=min(ans,qmin(id<<1|1,mid+1,r,lq,rq));
	return ans;
}

signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	rep(i,1,n-1){
		cin>>eu[i]>>ev[i]>>ew[i],++eu[i],++ev[i];
		e[eu[i]].push_back({ev[i],ew[i]}),e[ev[i]].push_back({eu[i],ew[i]});
	}
	dfs1(1),dfs2(1),build(1,1,n,tmp),cin>>q;
	rep(o,1,q){
		int u,v,k,w,ans;
		string opt;
		cin>>opt;
		if(opt=="SUM") ans=0;
		if(opt=="MAX") ans=-1e3;
		if(opt=="MIN") ans=1e3;
		if(opt=="C"){
			cin>>k>>w,u=eu[k],v=ev[k];
			if(dep[u]<dep[v]) swap(u,v);
			change(1,1,n,id[u],w);
			continue;
		}
		cin>>u>>v,++u,++v;
		for(;lt[u]!=lt[v];u=fa[lt[u]]){
			if(dep[lt[u]]<dep[lt[v]]) swap(u,v);
			if(opt=="N") mk(1,1,n,id[lt[u]],id[u]);
			if(opt=="SUM") ans+=sum(1,1,n,id[lt[u]],id[u]);
			if(opt=="MAX") ans=max(ans,qmax(1,1,n,id[lt[u]],id[u]));
			if(opt=="MIN") ans=min(ans,qmin(1,1,n,id[lt[u]],id[u]));
		}
		if(id[u]>id[v]) swap(u,v);
		if(u!=v) if(opt=="N") mk(1,1,n,id[u]+1,id[v]);
		if(opt=="SUM") ans+=sum(1,1,n,id[u]+1,id[v]);
		if(opt=="MAX") ans=max(ans,qmax(1,1,n,id[u]+1,id[v]));
		if(opt=="MIN") ans=min(ans,qmin(1,1,n,id[u]+1,id[v]));
		if(opt!="N") cout<<ans<<'\n';
	}
	return 0;
}
2024/3/17 16:59
加载中...