70pts 树分块求条
查看原帖
70pts 树分块求条
504093
dyc2022楼主2024/12/27 18:33

整体应该没错了,但是后三个点 TLE,有谁能帮我卡卡吗?

#include<bits/stdc++.h>
#define endl '\n'
#define N 40006
using namespace std;
const int B=1000;
int n,q,a[N],b[N],bn,mxd[N],dep[N],id[N],fa[N],lst[N];
int siz[N],son[N],top[N],tot,lastans;
vector<int> G[N];
bitset<N> bt[44][44];
void dfs1(int u,int fath)
{
	fa[u]=fath,dep[u]=mxd[u]=dep[fath]+1,siz[u]=1;
	for(int v:G[u])if(v!=fath)
	{
		dfs1(v,u);
		mxd[u]=max(mxd[u],dep[v]),siz[u]+=siz[v];
		if(!son[u]||siz[son[u]]<siz[v])son[u]=v;
	}
	if(u==1||mxd[u]-dep[u]>B)id[u]=++tot,mxd[u]=dep[u];
}
void dfs2(int u,int tp)
{
	top[u]=tp;
	if(!son[u])return;
	dfs2(son[u],tp);
	for(int v:G[u])if(v!=fa[u]&&v!=son[u])
		dfs2(v,v);
}
void dfs3(int u,int pre)
{
	if(id[u])
	{
		lst[u]=pre,bt[id[u]][id[u]].set(a[u]);
		for(int v=u;v!=fa[pre];v=fa[v])bt[id[u]][id[pre]].set(a[v]);
		for(int v=lst[pre];v;v=lst[v])
			bt[id[u]][id[v]]=bt[id[u]][id[pre]],bt[id[u]][id[v]]|=bt[id[pre]][id[v]];
	}
	for(int v:G[u])if(v!=fa[u])
		dfs3(v,id[u]?u:pre);
}
int getLCA(int u,int v)
{
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		u=fa[top[u]];
	}
	return dep[u]<dep[v]?u:v;
}
int query(int u,int v)
{
	bitset<N> tmp;
	int LCA=getLCA(u,v);
	tmp.set(a[LCA]);
	for(;!id[u]&&u!=LCA;u=fa[u])tmp.set(a[u]);
	for(;!id[v]&&v!=LCA;v=fa[v])tmp.set(a[v]);
	if(u!=LCA)
	{
		int u2=u;
		for(;lst[u2]&&dep[u2]>dep[LCA];u2=lst[u2]);
		tmp|=bt[id[u]][id[u2]],u=u2;
		for(;u!=LCA;u=fa[u])tmp.set(a[u]);
	}
	if(v!=LCA)
	{
		int v2=v;
		for(;lst[v2]&&dep[v2]>dep[LCA];v2=lst[v2]);
		tmp|=bt[id[v]][id[v2]],v=v2;
		for(;v!=LCA;v=fa[v])tmp.set(a[v]);
	}
	int ret=tmp.count();
	return ret;
}
main()
{
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]),b[++bn]=a[i];
	for(int i=1,x,y;i<n;i++)
	{
		scanf("%d%d",&x,&y);
		G[x].push_back(y),G[y].push_back(x);
	}
	sort(b+1,b+1+bn),bn=unique(b+1,b+1+bn)-b-1;
	for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+1+bn,a[i])-b;
	dfs1(1,0),dfs2(1,1),dfs3(1,0);
	while(q--)
	{
		int u,v;
		scanf("%d%d",&u,&v),u^=lastans;
		printf("%d\n",lastans=query(u,v));
	}
	return 0;
}
2024/12/27 18:33
加载中...