全部RE了,求dalao调(只说原因就好)
查看原帖
全部RE了,求dalao调(只说原因就好)
809405
090810mzh楼主2024/8/10 16:20
#include<bits/stdc++.h>
#define rs dep<<1|1
#define ls dep<<1
using namespace std;
const int Maxn=1e5+10; 
struct E{
	int v;
	int next;
}e[Maxn];
int head[Maxn];
int fa[Maxn];
int son[Maxn];
int v[Maxn];
int dep[Maxn];
int dfn[Maxn];
int siz[Maxn];
int top[Maxn];
int w[Maxn];
int sum[Maxn*4];
int rp[Maxn*4];
int lp[Maxn*4];
int id[Maxn];
int cnt=0,tim=0;
int N,M,P,R;
void build(int u,int v){
	e[++cnt].v=v;
	e[cnt].next=head[u];
	head[u]=cnt;
}
void dfs1(int u,int f){
	fa[u]=f;
	dep[u]=dep[f]+1;
	siz[u]=1;
	int meme=-1;
	for(int i=head[u];i!=-1;i=e[i].next){
		int v=e[i].v;
		if(v==f)continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>meme){
		meme=siz[v];
			son[u]=v;
		}
	}
}
void dfs2(int u,int t){
	top[u]=t;
	dfn[u]=++tim;
	id[tim]=u;
	w[tim]=v[u];
	if(!son[u])return ;
	dfs2(son[u],t);
	for(int i=head[u];i!=-1;i=e[i].next){
		int v=e[i].v;
		if(v==fa[u]||v==son[u])continue;
		dfs2(v,v);
	}
}
void push_up(int dep){
	sum[dep]=sum[ls]+sum[rs];

}
void t_build(int l,int r,int dep){
	if(l==r){
		sum[dep]=w[l];
		lp[dep]=rp[dep]=l;
		return ;
	}
	int mid=(l+r)>>1;
	t_build(l,mid,ls);
	t_build(mid+1,r,rs);
	lp[dep]=l;
	rp[dep]=r;
	push_up(dep);
}
void ad(int L,int R,int l,int r,int dep){
	if(l==L&&r==R){
		sum[dep]++;
		return ;
	}
	int mid=(l+r)>>1;
	if(L<=mid)ad(L,R,l,mid,ls);
	if(R>mid)ad(L,R,mid+1,r,rs);
	push_up(dep);
}
int ser(int L,int R,int l,int r,int dep){
	if(L<=l&&r<=R){
		return sum[dep];
	}
	int res=0;
    int mid=l+r>>1;
	if(L<=mid)res+=ser(L,R,l,mid,ls);
	if(R>mid)res+=ser(L,R,mid+1,r,rs);
	return res;
}
void st(){
	memset(head,-1,sizeof(head));
	return ;
}
int ef(int l,int r){
	if(l==r)return id[l];
	int mid=(l+r)>>1;
	int tmp=ser(mid+1,r,1,N,1);
	if(tmp)ef(mid+1,r);
	else ef(l,mid);
}
int nl(int x,int y){
	while(top[x]!=top[y]){
		if(dep[x]<dep[y])swap(x,y);
		int tmp=ser(dfn[top[x]],dfn[x],1,N,1);
		if(tmp){
		return ef(dfn[top[x]],dfn[x]);
		}
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	return ef(dep[x],dep[y]);
}
int main(){
	v[1]=1;
	st();
	cin>>N>>M;
	for(int i=1;i<N;i++){
		int iu,ui;
		cin>>iu>>ui;
		build(iu,ui);
	}
	dfs1(1,1);
	dfs2(1,1);
	t_build(1,N,1);
	for(int i=1;i<=M;i++){
		char a;
		cin>>a;
		if(a=='C'){
			int x;
			cin>>x;
			ad(dfn[x],dfn[x],1,N,1);
		}
		if(a=='Q'){
			int x;
			cin>>x;
			cout<<nl(1,x)<<"\n";
		}
		a=0;
	}
	return 0;
} 
2024/8/10 16:20
加载中...