社区讨论

求调,不知道为什么全是MLE

P2633Count on a tree参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lyth76zd
此快照首次捕获于
2024/07/20 09:54
2 年前
此快照最后确认于
2024/07/24 23:03
2 年前
查看原帖
CPP
#include<cstdio>
#include<algorithm>
using namespace std;
int m,n,head[100005],tot,num[100005],len,f[100005][25],dep[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 fa)
{
	int p=lower_bound(Hash+1,Hash+len+1,w[u])-Hash;
	num[u]=insert(num[fa],1,len,p);
	for(int i=head[u];i;i=edge[i].next)
	{
		int v=edge[i].to;
		if(v==fa)	continue;
		dfs1(v,u);
	}
}
void dfs2(int u,int fa)
{
	f[u][0]=fa;
	for(int i=1;i<=19;i++)
		f[u][i]=f[f[u][i-1]][i-1];
	for(int i=head[u];i;i=edge[i].next)
	{
		int v=edge[i].to;
		if(v==fa)	continue;
		dep[v]=dep[u]+1;
		dfs2(v,u);
	}
}
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);
	dep[1]=1;
	dfs1(1,0);
	dfs2(1,0);
	for(int i=1;i<=m;i++)
	{
		int x,y,k;
		scanf("%d%d%d",&x,&y,&k);
		x^=last;
		int 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);
	}
}

调了一晚上,不知道怎么调MLE了

回复

3 条回复,欢迎继续交流。

正在加载回复...