求助Unknown Error
查看原帖
求助Unknown Error
494601
gcx12012楼主2023/4/19 16:14

树上莫队写了一下午,交上去就这样了,rt

#include<bits/stdc++.h>
#include<cmath>
#define ll long long
#define N 200010

using namespace std;
int head[N],to[N],nxt[N],tot=0;
int st[N],ed[N],dfn[N],cnt=0,siz[N],f[N],son[N],top[N],dep[N];
int n,m,q;
int val[N],val2[N],date[N];
int id[N],len;

ll read(){
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
void add(int u,int v){
	to[++tot]=v;
	nxt[tot]=head[u];
	head[u]=tot;
}
void dfs1(int u,int fa,int deep){
	dep[u]=deep;
	f[u]=fa;
	dfn[++cnt]=u;
	st[u]=cnt;
	siz[u]=1;
	int maxson=-1;
	for(int i=head[u];i;i=nxt[i]){
		int v=to[i];
		if(v==fa) continue;
		dfs1(v,u,deep+1);
		siz[u]+=siz[v];
		if(siz[v]>maxson){
			maxson=siz[v];
			son[u]=v;
		}
	}
	dfn[++cnt]=u;
	ed[u]=cnt;
}
void dfs2(int u,int topf){
	top[u]=topf;
	if(!son[u]) return;
	dfs2(son[u],topf);
	for(int i=head[u];i;i=nxt[i]){
		int v=to[i];
		if(v==son[u] || v==f[u]) continue;
		dfs2(v,v);
	}
}

int lca(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		x=f[top[x]];
	}
	if(dep[x]<dep[y]) return x;
	else return y;
}
struct node{
	int l,r,LF,ID,ans;
}a[N];
bool cmp(node x,node y){
	if(id[x.l]==id[y.l]){
		if(id[x.l]&1) return x.r>y.r;
		else return x.r<y.r;
	}else return id[x.l]<id[y.l];
}
void delquery(){
	for(int i=1;i<=q;i++){
		int x=read(),y=read();
		if(st[x]>st[y]) swap(x,y);
		int fu=lca(x,y);
		a[i].ID=i;
		if(fu==x) a[i].l=st[x],a[i].r=st[y];
		else a[i].l=ed[x],a[i].r=st[y],a[i].LF=fu;
	}
	sort(a+1,a+q+1,cmp);
}
int Ans,out[N],used[N],happen[N];
void add(int x){
	happen[x]++;
	if(happen[x]==1) Ans++;
}
void del(int x){
	happen[x]--;
	if(happen[x]==0) Ans--;
}
void Add(int x){
	if(used[x]) del(date[x]);
	else add(date[x]);
	used[x]^=1;
}
void MO(){
	int L=1,R=0;
	for(int i=1;i<=q;i++){
		while(L<a[i].l){
			Add(dfn[L]);
			L++;
		}
		while(L>a[i].l){
			L--;
			Add(dfn[L]);
		}
		while(R<a[i].r){
			R++;
			Add(dfn[R]);
		}
		while(R>a[i].r){
			Add(dfn[R]);
			R--;
		}
		if(a[i].LF) Add(a[i].LF);
		a[i].ans=Ans;
		if(a[i].LF) Add(a[i].LF);
	}
	for(int i=1;i<=q;i++) out[a[i].ID]=a[i].ans;
	for(int i=1;i<=q;i++) cout<<out[i]<<endl;
}

int main()
{
    n=read(),q=read();
    for(int i=1;i<=n;i++) val[i]=read(),val2[i]=val[i];
    sort(val2+1,val2+n+1);
    m=unique(val2+1,val2+n+1)-val2-1;
    for(int i=1;i<=n;i++) date[i]=lower_bound(val2+1,val2+m+1,val[i])-val2;
    len=sqrt(2*n);
    for(int i=1;i<=2*n;i++) id[i]=(i-1)/len+1;
    for(int i=1;i<n;i++){
    	int u=read(),v=read();
    	add(u,v);
    	add(v,u);
	}
	dfs1(1,0,1);
	dfs2(1,1);
	//for(int i=1;i<=2*n;i++) cout<<dfn[i]<<' ';
	delquery();
	MO();
    return 0;
}

2023/4/19 16:14
加载中...