求助只过了一个点
查看原帖
求助只过了一个点
315398
小杨小小杨楼主2025/8/29 12:18
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int head[N*2],lazy[N*4],f[N*4],n,NT,val[N],x,y,tot,cnt,xx;
char ch;
struct Edge{int to,nex;}edge[N*2];
struct Tree{int deid,id,dep,fa,son,st,top,val;}T[N];
void ins(int x,int y){edge[tot].to=y;edge[tot].nex=head[x];head[x]=tot++;}

int remax(int x,int y){return (T[x].dep>T[y].dep?x:y);}

void pushdown(int numk,int len){
	if (!lazy[numk]) return;
	lazy[numk<<1]=remax(lazy[numk<<1],lazy[numk]);
	lazy[numk<<1|1]=remax(lazy[numk<<1|1],lazy[numk]);
	f[numk<<1]=remax(f[numk<<1],lazy[numk]);
	f[numk<<1|1]=remax(f[numk<<1|1],lazy[numk]);
	lazy[numk]=0;
}
void pushup(int numk){f[numk]=remax(f[numk<<1],f[numk<<1|1]);}
void build(int numk,int l,int r){
	if (l==r) f[numk]=0;
	else{
		int mid=(l+r)>>1;
		build(numk<<1,l,mid);
		build(numk<<1|1,mid+1,r);
		pushup(numk);
	}
}
void change_t(int numk,int fl,int fr,int l,int r,int x){
	if (fl<=l&&fr>=r) f[numk]=remax(f[numk],x),lazy[numk]=remax(lazy[numk],x);
	else{
		pushdown(numk,r-l+1);
		int mid=(l+r)>>1;
		if (fl<=mid) change_t(numk<<1,fl,fr,l,mid,x);
		if (fr>mid) change_t(numk<<1|1,fl,fr,mid+1,r,x);
		pushup(numk);
	}
}
int query_t(int numk,int fl,int fr,int l,int r){
	if (fl<=l&&fr>=r) return f[numk];
	else{
		pushdown(numk,r-l+1);
		int mid=(l+r)>>1,ma=0;
		if (fl<=mid) ma=remax(ma,query_t(numk<<1,fl,fr,l,mid));
		if (fr>mid) ma=remax(ma,query_t(numk<<1|1,fl,fr,mid+1,r));
		return ma;
	}
}

void dfs1(int u,int fa,int dep){
	int ms=-1;
	T[u].dep=dep;T[u].fa=fa;T[u].st=1;
	for (int i=head[u];~i;i=edge[i].nex){
		int v=edge[i].to;
		if (v==fa) continue;
		dfs1(v,u,dep+1);
		T[u].st+=T[v].st;
		if (T[v].st>ms) ms=T[v].st,T[u].son=v;
	}
}
void dfs2(int u,int top){
	T[u].top=top;T[u].id=++cnt;T[cnt].val=val[u];T[cnt].deid=u;
	if (!T[u].son) return;
	dfs2(T[u].son,top);
	for (int i=head[u];~i;i=edge[i].nex){
		int v=edge[i].to;
		if (v==T[u].son||v==T[u].fa) continue;
		dfs2(v,v);
	}
}
int query(int x,int y){
	int ans=0;
	while (T[x].top!=T[y].top){
		if (T[T[x].top].dep>T[T[y].top].dep) swap(x,y);
		ans=remax(ans,query_t(1,T[T[x].top].id,T[x].id,1,n));
		if (ans!=-1) return T[ans].deid;
		x=T[T[x].top].fa;
	}
	if (T[x].dep>T[y].dep) swap(x,y);
	ans=remax(ans,query_t(1,T[x].id,T[y].id,1,n));
	return T[ans].deid;
}
void change(int x){
	change_t(1,T[x].id,T[x].id+T[x].st-1,1,n,x);
}

int main(){
	scanf("%d%d",&n,&NT);val[1]=1;
	memset(head,-1,sizeof(head));
	for (int i=1;i<n;i++) scanf("%d%d",&x,&y),ins(x,y),ins(y,x);
	dfs1(1,0,1);dfs2(1,1);build(1,1,n);change_t(1,1,n,1,n,1);
	while (NT--){
		cin>>ch;scanf("%d",&xx);
		if (ch=='Q') printf("%d\n",query(1,xx));
		else change(xx);
	}
	return 0;
}
2025/8/29 12:18
加载中...