社区讨论

20pts球调

P1505[国家集训队] 旅游参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo1rzjyt
此快照首次捕获于
2023/10/23 02:01
2 年前
此快照最后确认于
2023/11/03 02:38
2 年前
查看原帖
CPP
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<stack>
#include<queue>
#include<list>
#define int long long
#define ll long long
#define S 10000001
#define inf 2147483647
#define in inline
#define re register int
#define debug putchar('1');
#define ed putchar('\n');
using namespace std;
inline int rd(){
	char a=getchar();
	int f=1,x=0;
	while(a<'0'||a>'9'){
		if(a=='-')
		  f=-1;
		a=getchar();
	}
	while(a>='0'&&a<='9'){
		x=(x<<3)+(x<<1)+(long(a^48));
		a=getchar();
	}
	return f*x;
}
void qwqqwq(ll x){
	if(x!=0){
		qwqqwq(x/10);
		putchar(x%10^48);
	}
	return;
}
in void wt(ll x){
	if(x==0){
		putchar('0');
		return;
	}
	if(x<0){
		x=-x;
		putchar('-');
	}
	qwqqwq(x);
	return;
}
in ll max(ll a,ll b){
	return a>b?a:b;
}
in ll min(ll a,ll b){
	return a>b?b:a;
}
in ll abs(ll a){
	return a<0?-a:a;
}
in void swap(ll &a,ll &b){
	a^=b;
	b^=a;
	a^=b;
}
struct edge{
	int to,nxt,w;
}edge[S];
int h[S],cnt;
in void add(int u,int v,int w){
	edge[++cnt].to=v;
	edge[cnt].w=w;
	edge[cnt].nxt=h[u];
	h[u]=cnt;
	return;
}
int dep[S],val[S],v[S],id[S],f[S],si[S],son[S],top[S],tot,u1[S],s1[S];
void dfs1(int u,int fa){
	dep[u]=dep[fa]+1;
	si[u]=1;
	f[u]=fa;
	for(re i=h[u];i;i=edge[i].nxt){
		int t=edge[i].to;
		if(t==fa)
		  continue;
		v[t]=edge[i].w;
		dfs1(t,u);
		si[u]+=si[t];
		if(si[t]>si[son[u]])
		  son[u]=t;
	}
	return;
}
void dfs2(int u,int tp){
	top[u]=tp;
	id[u]=++tot;
	val[tot]=v[u];
	if(son[u]==0)
	  return;
	dfs2(son[u],tp);
	for(re i=h[u];i;i=edge[i].nxt){
		int t=edge[i].to;
		if(t==son[u]||t==f[u])
		  continue;
		dfs2(t,t);
	}
	return;
}
struct node{
	int l,r,w,min,max,lz;
}t[S];
void pu(int i){
	t[i].w=t[i<<1].w+t[i<<1|1].w;
	t[i].max=max(t[i<<1].max,t[i<<1|1].max);
	t[i].min=min(t[i<<1].min,t[i<<1|1].min);
	return;
}
void build(int i,int l,int r){
	t[i].l=l;
	t[i].r=r;
	t[i].min=inf;
	t[i].max=-inf;
	if(l==r){
		t[i].w=t[i].max=t[i].min=val[l];
		return;
	}
	int mid=(l+r)>>1;
	build(i<<1,l,mid);
	build(i<<1|1,mid+1,r);
	pu(i);
	return;
}
void pd(int i){
	if(t[i].lz==0)
	  return;
	t[i<<1].lz^=1;
	t[i<<1|1].lz^=1;
	t[i<<1].w=-t[i<<1].w;
	t[i<<1|1].w=-t[i<<1|1].w;
	t[i<<1].max=-t[i<<1].max;
	t[i<<1].min=-t[i<<1].min;
	t[i<<1|1].min=-t[i<<1|1].min;
	t[i<<1|1].max=-t[i<<1|1].max;
	swap(t[i<<1].min,t[i<<1].max);
	swap(t[i<<1|1].min,t[i<<1|1].max);
	t[i].lz=0;
	return;
}
void Up(int i,int x,int w){
	if(t[i].l==t[i].r){
		t[i].w=t[i].max=t[i].min=w;
		return;
	}
	pd(i);
	if(t[i<<1].r>=x)
	  Up(i<<1,x,w);
	else
	  Up(i<<1|1,x,w);
	pu(i);
	return;
}
int qu1(int i,int l,int r){
	if(t[i].l>=l&&t[i].r<=r){
		return t[i].w;
	}
	pd(i);
	int ans=0;
	if(t[i<<1].r>=l)
	  ans+=qu1(i<<1,l,r);
	if(t[i<<1|1].l<=r)
	  ans+=qu1(i<<1|1,l,r);
	return ans;
}
int qu2(int i,int l,int r){
	if(t[i].l>=l&&t[i].r<=r){
		return t[i].max;
	}
	pd(i);
	int ans=-inf;
	if(t[i<<1].r>=l)
	  ans=max(ans,qu2(i<<1,l,r));
	if(t[i<<1|1].l<=r)
	  ans=max(ans,qu2(i<<1|1,l,r));
	return ans;
}
int qu3(int i,int l,int r){
	if(t[i].l>=l&&t[i].r<=r){
		return t[i].min;
	}
	pd(i);
	int ans=inf;
	if(t[i<<1].r>=l)
	  ans=min(ans,qu3(i<<1,l,r));
	if(t[i<<1|1].l<=r)
	  ans=min(ans,qu3(i<<1|1,l,r));
	return ans;
}
void up(int i,int l,int r){
	if(t[i].l>=l&&t[i].r<=r){
		t[i].w=-t[i].w;
		t[i].min=-t[i].min;
		t[i].max=-t[i].max;
		t[i].lz^=1;
		swap(t[i].min,t[i].max);
		return;
	}
	pd(i);
	if(t[i<<1].r>=l)
	  up(i<<1,l,r);
	if(t[i<<1|1].l<=r)
	  up(i<<1|1,l,r);
	pu(i);
	return;
}
int Qu1(int l,int r){
	int ans=0;
	while(top[l]!=top[r]){
		if(dep[top[l]]<dep[top[r]])
		  swap(l,r);
		ans+=qu1(1,id[top[l]],id[l]);
		l=f[top[l]];
	}
	if(dep[l]>dep[r])
	  swap(l,r);
	ans+=qu1(1,id[l]+1,r);
	return ans;
}
int Qu2(int l,int r){
	int ans=-inf;
	while(top[l]!=top[r]){
		if(dep[top[l]]<dep[top[r]])
		  swap(l,r);
		ans=max(ans,qu2(1,id[top[l]],id[l]));
		l=f[top[l]];
	}
	if(dep[l]>dep[r])
	  swap(l,r);
	ans=max(ans,qu2(1,id[l]+1,id[r]));
	return ans;
}
int Qu3(int l,int r){
	int ans=inf;
	while(top[l]!=top[r]){
		if(dep[top[l]]<dep[top[r]])
		  swap(l,r);
		ans=min(ans,qu3(1,id[top[l]],id[l]));
		l=f[top[l]];
	}
	if(dep[l]>dep[r])
	  swap(l,r);
	ans=min(ans,qu3(1,id[l]+1,id[r]));
	return ans;
}
void up1(int l,int r){
	while(top[l]!=top[r]){
		if(dep[top[l]]<dep[top[r]])
		  swap(l,r);
		up(1,id[top[l]],id[l]);
		l=f[top[l]];
	}
	if(dep[l]>dep[r])
	  swap(l,r);
	up(1,id[l]+1,r);
	return;
}
signed main(){
	int n=rd();
	for(re i=1;i<n;++i){
		int u=rd()+1,v=rd()+1,w=rd();
		u1[i]=u;
		s1[i]=v;
		add(u,v,w);
		add(v,u,w);
	}
	int m=rd()+1;
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	while(--m){
		string str;
		cin>>str;
		int l=rd()+1,r=rd()+1;
		if(str[0]=='C'){
			--r;
			--l;
			if(dep[u1[l]]<dep[s1[l]])
			  swap(u1[l],s1[l]);
			Up(1,id[u1[l]],r);
		}
		if(str[0]=='N')
		  up1(l,r);
		if(str[0]=='S'){
			wt(Qu1(l,r));
			ed
		}
		if(str[1]=='A'){
			wt(Qu2(l,r));
			ed
		}
		if(str[1]=='I'){
			wt(Qu3(l,r));
			ed
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...