求调,全是MLE
查看原帖
求调,全是MLE
546012
mujiajun楼主2024/7/20 09:40
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
int m,n,head[100005],tot,num[100005],len,f[100005][25],dep[100005],vis[100005];
long long Hash[100005],w[100005],last;
struct sd{
	int next,to;
}edge[200005];
struct sb{
	int l,r,v;
}tr[3000005];
void add(int x,int y)
{
	edge[++tot].next=head[x];
	edge[tot].to=y;
	head[x]=tot;
}
int build(int l,int r)
{
	int rt=++tot;
	tr[rt].v=0;
	if(l==r)	return rt;
	int mid=(l+r)>>1;
	tr[rt].l=build(l,mid);
	tr[rt].r=build(mid+1,r);
	return rt;
}
int insert(int fa,int l,int r,int va)
{
	int rt=++tot;
	tr[rt].l=tr[fa].l;
	tr[rt].r=tr[fa].r;
	tr[rt].v=tr[fa].v+1;
//	printf("%d %d\n",rt,tr[rt].v);
	if(l==r)	return rt;
	int mid=(l+r)>>1;
	if(va<=mid)	tr[rt].l=insert(tr[fa].l,l,mid,va);
	else	tr[rt].r=insert(tr[fa].r,mid+1,r,va);
	return rt;
}
int ask(int x,int y,int z,int a,int l,int r,int k)
{
	if(l==r)	return l;
	int sum=tr[tr[x].l].v+tr[tr[y].l].v-tr[tr[z].l].v-tr[tr[a].l].v;
//	printf("%d %d %d %d %d %d %d %d\n",sum,l,r,k,tr[x].l,tr[y].l,tr[z].l,tr[a].l);
	int mid=(l+r)>>1;
	if(sum>=k)	return ask(tr[x].l,tr[y].l,tr[z].l,tr[a].l,l,mid,k);
	else	return ask(tr[x].r,tr[y].r,tr[z].r,tr[a].r,mid+1,r,k-sum);
}
void dfs1(int u)
{
	int p=lower_bound(Hash+1,Hash+len+1,w[u])-Hash;
	num[u]=insert(num[f[u][0]],1,len,p);
	for(int i=head[u];i;i=edge[i].next)
	{
		int v=edge[i].to;
		if(u==f[v][0])	continue;
		dfs1(v);
	}
}
void bfs2()
{
	queue<int>	q;
	q.push(1);
	vis[1]=1;
	while(q.size())
	{
		int x=q.front();
		q.pop();
		for(int i=head[x];i;i=edge[i].next)
		{
			int y=edge[i].to;
			if(vis[y])	continue;
			dep[y]=dep[x]+1;
			f[y][0]=x;
			vis[y]=1;
			for(int j=1;j<=19;j++)
				f[y][j]=f[f[y][j-1]][j-1];
			q.push(y);
		}
	}
}
int lca(int x,int y)
{
	if(dep[x]<dep[y])	swap(x,y);
	for(int i=19;i>=0;i--)
		if(dep[f[x][i]]>=dep[y])	x=f[x][i];
	if(x==y)	return x;
	for(int i=19;i>=0;i--)
		if(f[x][i]!=f[y][i])
		{
			x=f[x][i];
			y=f[y][i];
		}
	return f[x][0];
}
int main()
{
//	freopen("P2633_1.in","r",stdin);
//	freopen("1.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&w[i]);
		Hash[i]=w[i]; 
	}
	for(int i=1;i<n;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		add(a,b);
		add(b,a);
	}
	tot=0;
	sort(Hash+1,Hash+n+1);
	len=unique(Hash+1,Hash+n+1)-Hash-1;
	num[0]=build(1,len);
	bfs2();
	dfs1(1);
	for(int i=1;i<=m;i++)
	{
		int x,y,k;
		scanf("%d%d%d",&x,&y,&k);
		x=x^last;
		int p;
		p=lca(x,y);
//		printf("%d %d\n",x,lca(x,y));
		last=Hash[ask(num[x],num[y],num[p],num[f[p][0]],1,len,k)];
		printf("%lld\n",last);
	}
}

调了一晚上了,不知道怎么调,求大佬帮忙调一下
2024/7/20 09:40
加载中...