(AC#11)8pts,求条
查看原帖
(AC#11)8pts,求条
889917
limingyuan333楼主2024/12/1 17:32
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
using namespace std;
const int MAXN=2e5+10;
int x,y,c,n;
struct node{
	int to,nxt,d;
}a[MAXN<<1];
int head[MAXN],tot;
int dfn[MAXN],top[MAXN],fa[MAXN],son[MAXN];
int sz[MAXN],dep[MAXN],cnt,lr[MAXN],w[MAXN];
bool is[MAXN];
void add(int x,int y,int w){
	a[++tot].to=y;
	a[tot].nxt=head[x];
	a[tot].d=w;
	head[x]=tot;
}
void dfs1(int now,int f){
	fa[now]=f;dep[now]=dep[f]+1,sz[now]=1;
	int maxn=0;
	for(int i=head[now];i;i=a[i].nxt){
		int to=a[i].to;
		if(to==f)	continue;
		w[to]=a[i].d;
		dfs1(to,now);
		sz[now]+=sz[to];
		if(sz[to]>maxn)	maxn=sz[to],son[now]=to;
	}
	is[son[now]]=1;
}
void dfs2(int now,int f){
	dfn[now]=++cnt,lr[cnt]=now;
	if(!is[now])	top[now]=now;
	else	top[now]=top[f];
	if(son[now])	dfs2(son[now],now);
	else	return ;
	for(int i=head[now];i;i=a[i].nxt){
		int to=a[i].to;
		if((to==f)||(son[now]==to))	continue;
		dfs2(to,now);
	}
} 
struct Node{
	int tag,mx,mi,pre;
}t[MAXN<<2];
void push_up(int p){
	t[p].mx=max(t[p<<1].mx,t[p<<1|1].mx);
	t[p].mi=min(t[p<<1].mi,t[p<<1|1].mi);
	t[p].pre=t[p<<1].pre+t[p<<1|1].pre;
}
void build(int p,int l,int r){
	if(l==r){
		t[p].mi=t[p].mx=t[p].pre=w[lr[l]];return ;
	}
	int mid=l+r>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	push_up(p);	
}
void down(int p){
	swap(t[p].mi,t[p].mx);
	t[p].mx=-t[p].mx;
	t[p].mi=-t[p].mi,t[p].pre=-t[p].pre;
	
	t[p].tag^=1;
}
void push_down(int p){
	if(t[p].tag){
		down(p<<1),down(p<<1|1);
		t[p].tag=0;
	}
}
void update1(int p,int l,int r,int x,int y){
	if(l>=x&&r<=y){
		down(p);
		return ;
	}
	push_down(p);
	int mid=l+r>>1;
	if(mid>=x)	update1(p<<1,l,mid,x,y);
	else	update1(p<<1|1,mid+1,r,x,y);
	push_up(p);
}
void modify(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])	swap(x,y);
		update1(1,1,cnt,dfn[top[x]],dfn[x]);
		x=fa[top[x]];
	}
	if(dep[x]<dep[y])	update1(1,1,cnt,dfn[x],dfn[y]);
	else	update1(1,1,cnt,dfn[y],dfn[x]);
} 
void update2(int p,int l,int r,int x,int w){
	if(l==r){
		t[p].mi=t[p].pre=t[p].mx=w;return ;
	}
	push_down(p);
	int mid=l+r>>1;
	if(mid>=x)	update2(p<<1,l,mid,x,w);
	else	update2(p<<1|1,mid+1,r,x,w);
	push_up(p);
}
int query_pre(int p,int l,int r,int x,int y){
	if(l>=x&&r<=y) return t[p].pre;
	push_down(p);
	int mid=l+r>>1;
	int ans=0;
	if(mid<y) ans+=query_pre(p<<1|1,mid+1,r,x,y);
	if(mid>=x) ans+=query_pre(p<<1,l,mid,x,y);
	return ans;
}
int ask_pre(int x,int y){
	int ans=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])	swap(x,y);
		ans+=query_pre(1,1,cnt,dfn[top[x]],dfn[x]);
		x=fa[top[x]];
	}
	if(dep[x]<dep[y])	ans+=query_pre(1,1,cnt,dfn[x],dfn[y]);
	else	ans+=query_pre(1,1,cnt,dfn[y],dfn[x]);
	return ans;
}
int query_max(int p,int l,int r,int x,int y){
	if(l>=x&&r<=y) return t[p].mx;
	push_down(p);
	int mid=l+r>>1;
	int ans=LLONG_MIN;
	if(mid<y) ans=max(ans,query_max(p<<1|1,mid+1,r,x,y));
	if(mid>=x) ans=max(ans,query_max(p<<1,l,mid,x,y));
	return ans;
}
int ask_max(int x,int y){
	int ans=LLONG_MIN;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])	swap(x,y);
		ans=max(ans,query_max(1,1,cnt,dfn[top[x]],dfn[x]));
		x=fa[top[x]];
	}
	if(dep[x]<dep[y])	ans=max(ans,query_max(1,1,cnt,dfn[x]+1,dfn[y]));
	else	ans=max(ans,query_max(1,1,cnt,dfn[y]+1,dfn[x]));
	return ans;
}
int query_min(int p,int l,int r,int x,int y){
	if(l>=x&&r<=y){
		return t[p].mi;
	}
	push_down(p);
	int mid=l+r>>1;
	int ans=LLONG_MAX;
	if(mid<y) ans=min(ans,query_min(p<<1|1,mid+1,r,x,y));
	if(mid>=x) ans=min(ans,query_min(p<<1,l,mid,x,y));
	return ans;
}
int ask_min(int x,int y){
	int ans=LLONG_MAX;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])	swap(x,y);
		ans=min(ans,query_min(1,1,cnt,dfn[top[x]],dfn[x]));
		x=fa[top[x]];
	}
	if(dep[x]<dep[y])	ans=min(ans,query_min(1,1,cnt,dfn[x]+1,dfn[y]));
	else	ans=min(ans,query_min(1,1,cnt,dfn[y]+1,dfn[x]));
	return ans;
}
pii siz[MAXN];
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL),cout.tie(NULL); 	 
	cin>>n;
	for(int i=1;i<n;i++){
		cin>>x>>y>>c;++x,++y,add(x,y,c),add(y,x,c);
		siz[i]=make_pair(x,y);
	}
	dfs1(1,0),dfs2(1,1);
	build(1,1,cnt);
	int m;cin>>m;
	while(m--){
		string op;int x,y;cin>>op>>x>>y;++x,++y;
		if(op[0]=='C')	--x,--y,update2(1,1,cnt,max(dfn[siz[x].first],dfn[siz[x].second]),y);
		else if(op[0]=='N') modify(x,y);
		else if(op=="SUM")	cout<<ask_pre(x,y)<<'\n';
		else if(op=="MIN")	cout<<ask_min(x,y)<<'\n';
		else	cout<<ask_max(x,y)<<'\n';
	}
	return 0;
} 
2024/12/1 17:32
加载中...