样例过全wa,求助
  • 板块P4116 Qtree3
  • 楼主烛木
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/10/23 10:07
  • 上次更新2023/11/5 10:07:52
查看原帖
样例过全wa,求助
366746
烛木楼主2020/10/23 10:07
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
#define int long long
#define MAXN 1000086
int n,q,tot,dotot;
int ord[MAXN],imp[MAXN],l[MAXN],r[MAXN];
int deep[MAXN],fa[MAXN],size[MAXN],son[MAXN],top[MAXN],id[MAXN],di[MAXN];
struct node
{
	int first,next,go;
}p[MAXN];
inline void star(int a,int b)
{
	p[++tot].next=p[a].first;
	p[a].first=tot;
	p[tot].go=b;
}
inline void dfs1(int x,int f)
{
	fa[x]=f,deep[x]=deep[f]+1,size[x]=1;
	for(int i=p[x].first;i;i=p[i].next)
	{
		int y=p[i].go;
		if(y==f) continue;
		dfs1(y,x);
		size[x]+=size[y];
		if(size[y]>size[son[x]]) son[x]=y;
	}
}
inline void dfs2(int x,int topf)
{
	id[x]=++dotot,top[x]=topf,di[dotot]=x;
	if(!son[x]) return ;
	dfs2(son[x],topf);
	for(int i=p[x].first;i;i=p[i].next)
	{
		int y=p[i].go;
		if(!top[y]) dfs2(y,y);
	}
}
inline void build(int k,int x,int y)
{
	l[k]=x,r[k]=y,imp[k]=1e12;
	if(x==y) return ;
	int mid=(x+y)>>1;
	build(k<<1,x,mid);
	build(k<<1|1,mid+1,y);
}
inline void update(int k,int x)
{
	if(l[k]==r[k])
	{
		if(imp[k]==1e12) imp[k]=di[x];
		else imp[k]=1e12;
		return ;
	}
	if(x<=r[k<<1]) update(k<<1,x);
	if(x>=l[k<<1|1]) update(k<<1|1,x);
	imp[k]=min(imp[k<<1],imp[k<<1|1]);
}
inline int answer(int k,int x,int y)
{
	if(x<=l[k]&&y>=r[k]) return imp[k];
	int ans=1e12;
	if(x<=r[k<<1]) ans=min(ans,answer(k<<1,x,y));
	if(y>=l[k<<1|1]) ans=min(ans,answer(k<<1|1,x,y));
	return ans;
}
inline int anschain(int x,int y)
{
	int ans=1e12;
	while(top[x]!=top[y])
	{
		if(deep[top[x]]<deep[top[y]]) swap(x,y);
		ans=min(ans,answer(1,id[top[x]],id[x]));
		x=fa[top[x]];
	}
	if(deep[x]>deep[y]) swap(x,y);
	ans=min(ans,answer(1,id[x],id[y]));
	return ans;
}
signed main()
{
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<n;i++)
	{
		int x,y;
		scanf("%lld%lld",&x,&y);
		star(x,y);
		star(y,x);
	}
	dfs1(1,0),dfs2(1,1),build(1,1,n);
	while(q--)
	{
		int t,x;
		scanf("%lld%lld",&t,&x);
		if(t==0) update(1,id[x]);
		else 
		{
			int v=anschain(1,x);
			if(v==1e12) printf("-1\n");
			else printf("%lld\n",v);
		}
	}
	return 0;
}
2020/10/23 10:07
加载中...