树上莫队板子 WA 求助
查看原帖
树上莫队板子 WA 求助
252664
Twig_K楼主2024/8/11 10:23

RT,以下代码弱化版可以通过,spoj 上评测到 running master judge 后就报 WA 了。翻了一遍讨论区无果。

#include<bits/stdc++.h>
#define pb emplace_back
using namespace std;
const int maxn=1e5+10;

int n,m,q,B;
int a[maxn],b[maxn];
vector<int> ve[maxn];

int dep[maxn],fa[maxn],son[maxn],sz[maxn];
void dfs1(int u)
{
	dep[u]=dep[fa[u]]+1,sz[u]=1;
	for(int i=0;i<ve[u].size();++i)
		if(ve[u][i]^fa[u])
			fa[ve[u][i]]=u,dfs1(ve[u][i]),
			sz[u]+=sz[ve[u][i]],son[u]=(sz[ve[u][i]]>sz[son[u]])?ve[u][i]:son[u];
}

int timer;
int tp[maxn];
int seq[maxn];
int st[maxn],ed[maxn];
void dfs2(int u,int topf)
{
	st[u]=++timer,seq[timer]=u,tp[u]=topf;
	if(son[u]) dfs2(son[u],topf);
	for(int i=0;i<ve[u].size();++i) if(ve[u][i]^fa[u]&&ve[u][i]^son[u]) dfs2(ve[u][i],ve[u][i]);
	ed[u]=++timer,seq[timer]=u;
}
int lca(int x,int y){
	while(tp[x]^tp[y]){
		if(dep[tp[x]]<dep[tp[y]]) x^=y^=x^=y;
		x=fa[tp[x]];
	}
	return dep[x]>dep[y]?y:x;
}

int ans;
int res[maxn];
int cnt[maxn],est[maxn];
struct query{
	int Lca;
	int l,r,id,bl;
}qry[100005]; 

int getB(int x){ return (x+B-1)/B; }
bool cmp(query xx,query yy){ return xx.bl==yy.bl?xx.r<yy.r:xx.bl<yy.bl; }
void upd(int x){
	if(est[x]) ans-=(!(--cnt[a[x]]));
	else ans+=((++cnt[a[x]])==1);
	est[x]^=1;
}
signed main()
{
	scanf("%d%d",&n,&q);
	B=max((int)sqrt(q),1);
	for(int i=1;i<=n;++i) scanf("%d",&a[i]),b[i]=a[i];
	sort(b+1,b+1+n);
	m=unique(b+1,b+1+n)-b-1;
	for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+1+m,a[i])-b;
	for(int i=1,u,v;i<n;++i) scanf("%d%d",&u,&v),ve[u].pb(v),ve[v].pb(u);
	dfs1(1),dfs2(1,1);
	for(int i=1;i<=q;++i)
	{
		int x,y;scanf("%d%d",&x,&y);
		int l=lca(x,y);
		if(st[x]>st[y]) x^=y^=x^=y;
		qry[i].id=i;
		if(l==x) qry[i].l=st[x],qry[i].r=st[y];
		else qry[i].l=ed[x],qry[i].r=st[y],qry[i].Lca=l;
		qry[i].bl=getB(qry[i].l);
	}
	sort(qry+1,qry+1+q,cmp);
	int l=1,r=0;
	for(int i=1;i<=q;++i)
	{
		while(l>qry[i].l) upd(seq[--l]);
		while(r<qry[i].r) upd(seq[++r]);
		while(l<qry[i].l) upd(seq[l++]);
		while(r>qry[i].r) upd(seq[r--]);
		if(qry[i].Lca) upd(qry[i].Lca);
		res[qry[i].id]=ans;
		if(qry[i].Lca) upd(qry[i].Lca);
	}
	for(int i=1;i<=q;++i) printf("%d\n",res[i]);
	return 0;
}
2024/8/11 10:23
加载中...