RE 求助
查看原帖
RE 求助
658198
gesong1234楼主2023/7/2 21:39

RT

#include<stdio.h>
#define int long long
#define N 100010
int h[N],e[N<<1],nx[N<<1],c[N<<1],ww[N],n;
int dfn[N],sz[N],top[N],son[N],idx,cnt,nw[N],d[N],fa[N];
int max(int x,int y){
    if (x>y) return x;
    return y;
} 
void add(int u,int v,int w){
	e[idx]=v,c[idx]=w,nx[idx]=h[u],h[u]=idx++;
	e[idx]=u,c[idx]=w,nx[idx]=h[v],h[v]=idx++;
}
void dfs1(int u,int f){
	sz[u]=1,fa[u]=f;
	for (int i=h[u];~i;i=nx[i]){
		int v=e[i],w=c[i];
		if (v==f) continue;
		ww[v]=w;
		d[v]=d[u]+1;
		dfs1(v,u);
		sz[u]+=sz[v];
		if (sz[son[u]]<sz[v]) son[u]=v;
	}
}
void dfs2(int u,int t){
	top[u]=t,dfn[u]=++cnt,nw[cnt]=ww[u];
	if (!son[u]) return ;
	dfs2(son[u],t);
	for (int i=h[u];~i;i=nx[i]){
		int v=e[i];
		if (v==son[u]||v==fa[u]) continue;
		dfs2(v,v);
	}
}
struct nord{
	int l,r,mx;
}t[N<<2];
#define lc k<<1
#define rc k<<1|1
void pushup(int k){
	t[k].mx=max(t[lc].mx,t[rc].mx);
}
void build(int k,int l,int r){
	t[k].l=l,t[k].r=r;
	if (l==r){
		t[k].mx=nw[l];
		return ;
	}
	int mid=(l+r)/2;
	build(lc,l,mid);
	build(rc,mid+1,r);
	pushup(k);
}
void change(int k,int x,int p){
	if (t[k].l==t[k].r){
		t[k].mx=p;
		return ;
	}
	int mid=(t[k].l+t[k].r)/2;
	if (x<=mid) change(lc,x,p);
	else change(rc,x,p);
	pushup(k);
}
int ask(int k,int l,int r){
	if (l<=t[k].l&&r>=t[k].r) return t[k].mx;
	int ans=-1e9;
	int mid=(t[k].l+t[k].r)/2;
	if (l<=mid) ans=max(ans,ask(lc,l,r));
	if (r>mid) ans=max(ans,ask(rc,l,r));
	return ans;
}
void swap1(int *u,int *v){
    int t=*v;
    *v=*u;
    *u=t;
}
int op1(int u,int v){
	if (u==v) return 0;
	int ans=-1e9;
	while(top[u]!=top[v]){
		if (d[top[u]]<d[top[v]]) swap1(&u,&v);
		ans=max(ans,ask(1,dfn[top[u]],dfn[u]));
		u=fa[top[u]];
	}
	if (d[u]<d[v]) swap1(&u,&v);
	if (u!=v) ans=max(ans,ask(1,dfn[v]+1,dfn[u]));
	return ans;
}
struct id{
	int x,y;
}a[N];
main(){
	int t;
	scanf("%lld",&t);
	while(t--){
		scanf("%lld",&n);
		cnt=idx=0;
		for (int i=1;i<=n;i++) h[i]=-1;
		for (int i=1;i<n;i++){
			int u,v,w;
			scanf("%lld%lld%lld",&u,&v,&w);
			add(u,v,w);
			a[i].x=u,a[i].y=v;
		}
		dfs1(1,0);
		dfs2(1,1);
		build(1,1,n);
		while(1){
			int u,v;
			char op[20];
			scanf("%s",op);
			if (*op=='D') break;
			scanf("%lld%lld",&u,&v);
			if (*op=='C'){
				int x=a[u].x,y=a[u].y;
				if (d[x]<d[y]) swap1(&x,&y);
				change(1,dfn[x],v);
			}
			else printf("%lld\n",op1(u,v));
		}	
	}
    return 0;
}
2023/7/2 21:39
加载中...