记录编号 334937 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [POJ 3237] 树的维护 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 4.199 s
提交时间 2016-11-01 19:30:26 内存使用 5.63 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=100010;
struct edge{int f,t,l,p;}w[N];
int n,head[N],tail[N],next[N];
void add(int f,int num){
	if (!head[f]) head[f]=tail[f]=num;
		else tail[f]=next[tail[f]]=num;
}
int fa[N],son[N][2],v[N],ma[N],mi[N];
bool root[N],rev[N],neg[N],E[N];//是否是边
#define lc son[x][0]
#define rc son[x][1]
void Neg(int x){
	neg[x]^=1;
	v[x]=-v[x];ma[x]=-ma[x];mi[x]=-mi[x];
	swap(mi[x],ma[x]);
}
void update(int x){
	if (E[x]) ma[x]=mi[x]=v[x];
		else ma[x]=-1e9,mi[x]=1e9;
	if (lc) ma[x]=max(ma[x],ma[lc]),mi[x]=min(mi[x],mi[lc]);
	if (rc) ma[x]=max(ma[x],ma[rc]),mi[x]=min(mi[x],mi[rc]);
}
void pushdown(int x){
	if (rev[x]){
		swap(son[lc][0],son[lc][1]);
		swap(son[rc][0],son[rc][1]);
		rev[lc]^=1;rev[rc]^=1;
		rev[x]=rev[0]=0;
	}
	if (neg[x]){
		Neg(lc);Neg(rc);
		neg[x]=neg[0]=0;
	}
}
void rotate(int x){
	int y=fa[x],z=fa[y];
	bool b=(x==son[y][1]);
	fa[son[y][b]=son[x][!b]]=y;
	fa[son[x][!b]=y]=x;
	fa[x]=z;
	if (y==son[z][0]) son[z][0]=x;else
	if (y==son[z][1]) son[z][1]=x;
	root[x]=root[y];root[y]=0;
	update(y);update(x);
}
void splay(int x){
	pushdown(x);
	while (!root[x]){
		int y=fa[x],z=fa[y];
		pushdown(z);pushdown(y);pushdown(x);
		if (root[y]){rotate(x);return;}
		if (x==son[y][0]) rotate(y==son[z][0]?y:x);
			else rotate(y==son[z][1]?y:x);
		rotate(x);
	}
}
void access(int x){
	splay(x);
	root[rc]=1;rc=0;
	update(x);
	while (fa[x]){
		int y=fa[x];
		splay(y);
		root[son[y][1]]=1;
		root[son[y][1]=x]=0;
		update(y);
		splay(x);
	}
}
void make_root(int x){
	access(x);
	rev[x]^=1;
	swap(lc,rc);
}
int cnt;
void dfs(int x){
	for (int i=head[x];i;i=next[i])
	if (!fa[w[i].t]){
		fa[fa[w[i].t]=++cnt]=x;
		root[cnt]=E[cnt]=1;
		ma[cnt]=mi[cnt]=v[cnt]=w[i].l;
		w[i].p=w[i<n?i+n:i-n].p=cnt;
		dfs(w[i].t);
	}
}
int main()
{
	freopen("maintaintree.in","r",stdin);
	freopen("maintaintree.out","w",stdout);
	scanf("%d",&n);
	for (int i=1;i<n;i++){
		scanf("%d%d%d",&w[i].f,&w[i].t,&w[i].l);
		w[i+n]=w[i];swap(w[i].f,w[i].t);
		add(w[i].f,i);add(w[i].t,i+n);
	}
	for (int i=1;i<=n;i++)
		root[i]=1,ma[i]=-1e9,mi[i]=1e9;
	cnt=n;fa[1]=1;dfs(1);fa[1]=0;
	while (1){
		char s[20];int a,b;
		scanf("%s%d%d",s,&a,&b);
		if (s[0]=='D') break;
		if (s[0]=='C'){
			access(w[a].p);
			v[w[a].p]=b;
			update(w[a].p);
		}
		else make_root(a),access(b);
		if (s[0]=='N') Neg(b);
		if (s[0]=='Q') printf("%d\n",ma[b]);
	}
	return 0;
}