TLE求助
  • 板块P4116 Qtree3
  • 楼主lg15166366290
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/24 20:29
  • 上次更新2024/10/24 21:16:07
查看原帖
TLE求助
1008001
lg15166366290楼主2024/10/24 20:29
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}

#define ls (p<<1)
#define rs (p<<1|1)
#define mid ((pl+pr)>>1)

const int N=100005;
const int M=200005;
const int inf=0x3f3f3f3f;

int n,q,siz[N],top[N],son[N],dep[N],f[N],dfn[N],num,t[N<<2],a[N],id[N];
struct edge{
	int next,v;
}e[M];
int head[N],cnt;
void addedge(int u,int v){
	e[++cnt].v=v;
	e[cnt].next=head[u];
	head[u]=cnt;
}

void dfs1(int i,int fa){
	f[i]=fa,dep[i]=dep[fa]+1,siz[i]=1;
	for(int j=head[i];j;j=e[j].next){
		int v=e[j].v;
		if(v==fa)continue;
		dfs1(v,i);
		siz[i]+=v;
		if(siz[son[i]]<siz[v])son[i]=v;
	}
}

void dfs2(int i,int topf){
	top[i]=topf;
	dfn[i]=++num;id[num]=i;
	if(son[i])dfs2(son[i],topf);
	for(int j=head[i];j;j=e[j].next){
		int v=e[j].v;
		if(v==f[i]||v==son[i])continue;
		dfs2(v,v);
	}
}

void pushup(int p){
	t[p]=min(t[ls],t[rs]);
}

void build(int p,int pl,int pr){
	if(pl==pr){
		t[p]=inf;
		return;
	}
	build(ls,pl,mid);
	build(rs,mid+1,pr);
	pushup(p);
}

void update(int pos,int p,int pl,int pr,int w){
	if(pl==pr){
		t[p]=w;
		return;
	}
	if(pos<=mid)update(pos,ls,pl,mid,w);
	else update(pos,rs,mid+1,pr,w);
	pushup(p);
}

int query(int l,int r,int p,int pl,int pr){
	if(l<=pl&&pr<=r){
		return t[p];
	}
	int ret=inf;
	if(l<=mid)ret=min(ret,query(l,r,ls,pl,mid));
	if(r>mid)ret=min(ret,query(l,r,rs,mid+1,pr));
	return ret;
}

int ask(int i,int j){
	int ret=inf;
	while(top[i]^top[j]){
		if(dep[top[i]]<dep[top[j]])swap(i,j);
		ret=min(ret,query(dfn[top[i]],dfn[i],1,1,n));
		i=f[top[i]];
	}
	if(dep[i]>dep[j])swap(i,j);
	ret=min(ret,query(dfn[i],dfn[j],1,1,n));
	return ret;
}

int main(){
	n=read(),q=read();
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		addedge(u,v),addedge(v,u);
	}
	dfs1(1,0);dfs2(1,1);build(1,1,n);
	while(q--){
		int op=read(),i=read();
		if(op==0){
			if(!a[i])update(dfn[i],1,1,n,dfn[i]),a[i]=1;
			else update(dfn[i],1,1,n,inf),a[i]=0;
		}else{
			int ans=ask(1,i);
			if(ans>1e9)puts("-1");
			else cout<<id[ans]<<"\n";
		}
	}
	return 0;
}
2024/10/24 20:29
加载中...