WA求调玄2关
查看原帖
WA求调玄2关
1121518
StarsIntoSea楼主2024/10/23 20:22
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
const int N=4e4+5;
int n,m,h[N],a[N],ans[N],b[N],id=0;
int st[N],ed[N],w[N<<1],d[N],vis[N],cnt=0;
int fa[N],siz[N],tops[N],dep[N],son[N],res=0;
struct node{int to,ne;}e[N<<1];
struct Que{int l,r,L,R,id,lca;}q[N*5];
bool cmp(Que x,Que y){
	if(x.L==y.L) return x.R<y.R;
	return x.L<y.L;
}
void add(int a,int b){
	e[++id]={b,h[a]};
	h[a]=id;
}
void dfs1(int x,int f){
	w[++cnt]=x,st[x]=cnt;
	fa[x]=f;
	dep[x]=dep[f]+1;
	siz[x]=1;
	int maxson=-1;
	for(int i=h[x];i;i=e[i].ne){
		int y=e[i].to;
		if(y==f) continue;
		dfs1(y,x);
		siz[x]+=siz[y];
		if(maxson<siz[y]) son[x]=y,maxson=siz[y];
	}
	w[++cnt]=x,ed[x]=cnt;
}
void dfs2(int x,int topf){
	tops[x]=topf;
	if(!son[x]) return ;
	dfs2(son[x],topf);
	for(int i=h[x];i;i=e[i].ne){
		int y=e[i].to;
		if(y==fa[x]||y==son[x]) continue;
		dfs2(y,y);
	}
}
int LCA(int x,int y){
	while(tops[x]!=tops[y]){
		if(dep[tops[x]]<dep[tops[y]]) swap(x,y);
		x=fa[tops[x]];
	}
	return dep[x]<dep[y]?x:y;
}
void add(int x){if(!d[a[x]])++res;++d[a[x]];}
void del(int x){--d[a[x]];if(!d[a[x]])--res;}
void use(int x){
	if(vis[x]) del(x),vis[x]=0;
	else add(x),vis[x]=1;
}
int main(){
	scanf("%d%d",&n,&m);
	int len=sqrt(2*n);
	for(int i=1;i<=n;++i) scanf("%d",&a[i]),b[i]=a[i];
	sort(b+1,b+n+1);
	int num=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+num+1,a[i])-b;
//	for(int i=1;i<=n;++i) printf("%d ",a[i]);printf("\n");
	for(int i=1;i<n;++i){
		int u,v;
		scanf("%d%d",&u,&v);
		add(u,v);add(v,u);
	}
	dfs1(1,0),dfs2(1,1);
//	for(int i=1;i<=2*n;++i) printf("%d ",w[i]);printf("\n");
//	for(int i=1;i<=n;++i) printf("%d %d\n",st[i],ed[i]);
//	while(1){
//		int x,y;
//		scanf("%d%d",&x,&y);
//		printf("%d\n",LCA(x,y));
//	}
	for(int i=1;i<=m;++i){
		int x,y;
		scanf("%d%d",&x,&y);
		if(st[x]>st[y]) swap(x,y);
		q[i].lca=LCA(x,y);
		q[i].id=i;
		if(q[i].lca==x){
			q[i].l=st[x];
			q[i].r=st[y];
			q[i].L=q[i].l/len;
			q[i].R=q[i].r/len;
			q[i].lca=-1;
		}
		else{
			q[i].l=ed[x];
			q[i].r=st[y];
			q[i].L=q[i].l/len;
			q[i].R=q[i].r/len;
		}
	}
	sort(q+1,q+m+1,cmp);
	int L=0,R=1;
	for(int i=1;i<=m;++i){
//		printf("%d %d %d %d\n",q[i].id,q[i].l,q[i].r,q[i].lca);
		while(L>q[i].l) use(w[--L]);
		while(R<q[i].r) use(w[++R]);
		while(L<q[i].l) use(w[L++]);
		while(R>q[i].r) use(w[R--]);
		if(q[i].lca!=-1) use(q[i].lca);
//		for(int i=1;i<=n;++i) printf("%d ",d[i]);printf("\n");
		ans[q[i].id]=res;
		if(q[i].lca!=-1) use(q[i].lca);
//		for(int i=1;i<=n;++i) printf("%d ",d[i]);printf("\n");
	}
	for(int i=1;i<=m;++i) printf("%d\n",ans[i]);
}
2024/10/23 20:22
加载中...