树剖求调,调半天不知所措
  • 板块学术版
  • 楼主mortis_life
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/7/15 21:03
  • 上次更新2023/11/3 09:38:19
查看原帖
树剖求调,调半天不知所措
751442
mortis_life楼主2023/7/15 21:03

p4116

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n,q;
int x,y,k,opt;

int head[100100],tot;
struct node{
	int to,nxt;
}e[200200];
void add1(int x,int y)
{
	e[++tot]=(node){y,head[x]};head[x]=tot;
}

int dep[100100],siz[100100],son[100100],fa[100100],dfn[100100],top[100100],cnt,id[100100];
void dfs1(int p,int f)
{
	fa[p]=f;siz[p]=1;dep[p]=dep[f]+1;
	for(int i=head[p];i;i=e[i].nxt)
	{
		int k=e[i].to;
		if(!dep[k])
		{
			dfs1(k,p);
			siz[p]+=siz[k];
			if(siz[k]>siz[son[p]]) son[p]=k;
		}
	}
}
void dfs2(int p,int t)
{
	top[p]=t,dfn[p]=++cnt;id[dfn[p]]=p;
	if(!son[p]) return ;
	dfs2(son[p],t);
	for(int i=head[p];i;i=e[i].nxt){
		int k=e[i].to;
		if(k!=fa[p]&&k!=son[p]) dfs2(k,k);
	}
}


int t[100100<<2],add[100100<<2];

void push_up(int p)
{
	t[p]=min(t[p<<1],t[p<<1|1]);
}

void build(int p,int l,int r)
{
	add[p]=-1;
	if(l==r) {
		t[p]=1e9;return ;
	}
	int mid=l+r>>1;
	build(p<<1,l,mid),build(p<<1|1,mid+1,r);
	push_up(p);
}

void update(int x,int p,int l,int r)
{
	
	if(l==r) {
		if(t[p]==1e9) t[p]=dfn[l];
		else t[p]=1e9;
        return;
	}
	int mid=l+r>>1;
	if(x<=mid) update(x,p<<1,l,mid);
	else update(x,p<<1|1,mid+1,r);
	push_up(p);
}

int query(int x,int y,int p,int l,int r)
{
	if(x<=l&&r<=y) return t[p];
	int mid=l+r>>1,sum=1e9;
	if(x<=mid) sum=min(sum,query(x,y,p<<1,l,mid));
	if(y>mid) sum=min(sum,query(x,y,p<<1|1,mid+1,r));
	return sum;
}

int query_t(int x,int y)
{
	int sum=1e9;
	while(top[x]^top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		sum=min(sum,query(dfn[top[x]],dfn[x],1,1,n));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	return sum=min(sum,query(dfn[x],dfn[y],1,1,n));
}

signed main()
{
	cin>>n>>q;
	for(int i=1;i<n;i++){
		
		cin>>x>>y;
		add1(x,y),add1(y,x);
	}
	dfs1(1,0),dfs2(1,1);build(1,1,n);
	while(q--)
	{
		cin>>opt;
		if(opt==0)
		{
			cin>>y;
			update(y,1,1,n);
		}
		else{
			cin>>x;
			int ans=query_t(1,x);
			if(ans==1e9) cout<<-1<<endl;
			else cout<<id[ans]<<endl;
		}
	}
	return 0;
} 
2023/7/15 21:03
加载中...