萌新刚学树上莫队,求救,在线等!!
查看原帖
萌新刚学树上莫队,求救,在线等!!
436389
Vidoliga楼主2021/12/22 19:40

rt,Wa第一个点。

求救,急!

#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define N 200200
#define Logn 30
#define mod 998244353
#define ll long long
#define Inf 0x3f3f3f3f
using namespace std;
inline int read(){
	register int d=0,f=1;char ch = getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){d = (d<<1)+(d<<3)+(ch^48);ch = getchar();}
	return d*f;
}
inline int max(const int &a,const int &b){return a>b?a:b;}
inline int min(const int &a,const int &b){return a<b?a:b;}
inline int swap(int &x,int &y){x^=y^=x^=y;}
int head[N],ecnt;
int n,m,cnt[N],vis[N],belong[N],first[N],last[N],ans[N],b[N],a[N],curL,curR,now,siz,bcnt;
int ncnt,lg[N],ord[N],dep[N],fa[N][Logn];
struct Edge{
	int v,nxt;
}edge[N<<1];
struct Query{
	int l,r,lca,id;
}que[N];
void init(int n){lg[0]=0;for(int i=1;i<=n;i++) lg[i]=lg[i-1]+((1<<lg[i-1])==i);}
inline void add(int u,int v){
	edge[++ecnt].v=v;
	edge[ecnt].nxt=head[u];
	head[u]=ecnt;
}
inline bool cmp(Query a,Query b){
	return (belong[a.l]^belong[b.l])?(belong[a.l]<belong[b.l]):((belong[a.l]&1)?a.r<b.r:a.r>b.r);
}
void dfs(int u,int f){
	ord[++ncnt]=u;
	first[u]=ncnt;
	fa[u][0]=f;dep[u]=dep[f]+1;
	for(int i=1;i<=lg[dep[u]];i++){ 
		fa[u][i]=fa[fa[u][i-1]][i-1]; 
	}
	for(int i=head[u];i;i=edge[i].nxt){
		if(edge[i].v!=f) dfs(edge[i].v,u);
	}
	ord[++ncnt]=u;
	last[u]=ncnt;
	return; 
}
int LCA(int x,int y){
	if(dep[x]<dep[y]) swap(x,y); 
	while(dep[x]>dep[y]){x=fa[x][lg[dep[x]-dep[y]]-1];}
	if(x==y) return x;
	for(int k=lg[dep[x]]-1;k>=0;k--){
		if(fa[x][k]!=fa[y][k]) x=fa[x][k],y=fa[y][k];
	}
	return fa[x][0];
}
inline void update(int x){
	vis[x]?now-=!--cnt[b[x]]:now+=!cnt[b[x]]++;vis[x]^=1;
}
signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++) a[i]=b[i]=read();
	sort(a+1,a+n+1);
	int tot=unique(a+1,a+n+1)-a-1;
	for(int i=1;i<=n;i++) b[i]=lower_bound(a+1,a+tot+1,b[i])-a;
	for(int i=1;i<n;i++){
		int x=read(),y=read();
		add(x,y),add(y,x);
	}
	dep[1]=1;
	init(n);dfs(1,0);
	siz=sqrt(ncnt),bcnt=ceil(double(ncnt)/siz);
	for(int i=1;i<=bcnt;i++){
		for(int j=siz*(i-1)+1;j<=i*siz;j++) belong[j]=i;
	}
	for(int i=1;i<=m;i++){
		int l=read(),r=read(),lca=LCA(l,r);
		if(first[l]>first[r]) swap(l,r);
		if(l==lca){que[i].l=first[l];que[i].r=first[r];que[i].lca=0;}
		else{que[i].l=last[l];que[i].r=first[r];que[i].lca=lca;}
		que[i].id=i;
	}
	sort(que+1,que+m+1,cmp);
	curL=1,curR=0;
	for(int i=1;i<=m;i++){
		int ql=que[i].l,qr=que[i].r,lca=que[i].lca;
		while(curL<ql) update(ord[curL++]);
		while(curL>ql) update(ord[--curL]);
		while(curR<qr) update(ord[++curR]);
		while(curR>qr) update(ord[curR--]);
		if(lca) update(lca);
		ans[que[i].id]=now;
		if(lca) update(lca);
	}
	for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
	return 0;
}
2021/12/22 19:40
加载中...