记录编号 324255 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [POJ 3237] 树的维护 最终得分 100
用户昵称 Gravatar森林 是否通过 通过
代码语言 C++ 运行时间 1.121 s
提交时间 2016-10-17 21:22:28 内存使用 1.47 MiB
显示代码纯文本
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=10100;
struct E{
	int to,next,w,num;
};E e[maxn<<1];  //dfs序中下标为i的点    点在dfs序中的下标
int head[maxn],len=0,dfn_t=0,dfn[maxn],id[maxn],deep[maxn],fa[maxn],top[maxn],size[maxn],son[maxn];
int val[maxn],change[maxn],t_max[maxn<<2],t_min[maxn<<2],n,lazy[maxn<<2];
inline void add(const int& from,const int& to,const int& w,const int&id){
	e[++len].to=to;
	e[len].w=w;
	e[len].num=id;
	e[len].next=head[from];
	head[from]=len;
}
inline void dfs(const int& x){
	size[x]=1;son[x]=0;
	for(int i=head[x];i!=-1;i=e[i].next){
		if(deep[e[i].to])continue;
		deep[e[i].to]=deep[x]+1;
		fa[e[i].to]=x;
		val[e[i].to]=e[i].w;
		change[e[i].num]=e[i].to;
		dfs(e[i].to);
		size[x]+=size[e[i].to];
		if(size[e[i].to]>size[son[x]])son[x]=e[i].to;
	}
}
inline void dfs(const int& x,const int& tp){
	top[x]=tp;dfn[++dfn_t]=x;id[x]=dfn_t;
	if(son[x])dfs(son[x],tp);
	for(int i=head[x];i!=-1;i=e[i].next){
		if(id[e[i].to])continue;
		dfs(e[i].to,e[i].to);
	}
}
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define mid ((l+r)>>1)
inline void update(const int& rt){
	t_max[rt]=max(t_max[rt<<1],t_max[rt<<1|1]);
	t_min[rt]=min(t_min[rt<<1],t_min[rt<<1|1]);
}
inline void build(const int& rt,const int& l,const int& r){
	if(l==r){
		t_max[rt]=t_min[rt]=val[dfn[l]];
		return;
	}
	build(lson);
	build(rson);
	update(rt);
}
int ql,qr,res;
inline void ch(const int & rt){
	t_min[rt]=-t_min[rt];
	t_max[rt]=-t_max[rt];
	swap(t_min[rt],t_max[rt]);
	lazy[rt]^=1;
}
inline void pushdown(const int&rt){
	ch(rt<<1);
	ch(rt<<1|1);
	lazy[rt]=0;
}
inline void query(const int & rt,const int& l,const int& r){
	if(ql<=l&&qr>=r){
		res=max(res,t_max[rt]);
		return;
	}
	if(lazy[rt])pushdown(rt);
	if(ql<=mid)query(lson);
	if(qr>mid)query(rson);
	update(rt);
}
inline int query(int l,int r){
	ql=l;qr=r;
	res=-0x7fffffff;
	query(1,1,n);
	return res;
}
inline int tree_query(int x,int y){
	int ans=-0x7fffffff;
	while(top[x]^top[y]){
		if(deep[top[x]]<deep[top[y]])swap(x,y);
		ans=max(ans,query(id[top[x]],id[x]));
		x=fa[top[x]];
	}
	if(x==y)return ans;
	if(deep[x]>deep[y])swap(x,y);
	return max(ans,query(id[son[x]],id[y]));
}
inline void modify(const int& rt,const int& l,const int& r){
	if(l==r){
		t_min[rt]=t_max[rt]=res;
		return;
	}
	if(lazy[rt])pushdown(rt);
	if(ql<=mid)modify(lson);
	else modify(rson);
	update(rt);
}
inline void tree_modify(const int& to,const int& w){
	ql=id[to];
	res=w;
	modify(1,1,n);
}
inline void Negate(const int& rt,const int& l,const int& r){
	if(ql<=l&&qr>=r){
		ch(rt);
		return;
	}
	if(lazy[rt])pushdown(rt);
	if(ql<=mid)Negate(lson);
	if(qr>mid)Negate(rson);
	update(rt);
}
inline void Negate(const int& l,const int& r){
	ql=l;qr=r;
	Negate(1,1,n);
}
inline void tree_negate(int x,int y){
	while(top[x]^top[y]){
		if(deep[top[x]]<deep[top[y]])swap(x,y);
		Negate(id[top[x]],id[x]);
		x=fa[top[x]];
	}
	if(x==y)return;
	if(deep[x]>deep[y])swap(x,y);
	Negate(id[son[x]],id[y]);
	
}
int main(){
	#define submit
	#ifdef submit
	freopen("maintaintree.in","r",stdin);
	freopen("maintaintree.out","w",stdout);
	#endif
	scanf("%d",&n);
	int a,b,c;
	memset(head,-1,sizeof head);
	for(int i=1;i<n;++i){
		scanf("%d%d%d",&a,&b,&c);
		add(a,b,c,i);
		add(b,a,c,i);
	}
	deep[1]=1;
	dfs(1);
	dfs(1,1);
	build(1,1,n);
	char str[10];
	while(scanf("%s",str),str[0]!='D'){
		scanf("%d%d",&a,&b);
		if(str[0]=='Q'){
			printf("%d\n",tree_query(a,b));
		}else if(str[0]=='C'){
			tree_modify(change[a],b);
		}else{
			tree_negate(a,b);
		}
	}
	#ifdef submit
	fclose(stdin);
	fclose(stdout);
	#else
	system("pause");
	#endif
}