为啥CE了啊
查看原帖
为啥CE了啊
341373
Autofreeze楼主2021/2/18 09:53

RT,本地能编译的

#include<bits/stdc++.h>
#define eps 1e-10
#define re register
#define N 201001
#define MAX 2001
#define inf 1e18
using namespace std;
typedef long long ll;
typedef double db;
inline void read(re ll &ret)
{
    ret=0;re ll pd=0;re char c=getchar();
    while(!isdigit(c)){pd|=c=='-';c=getchar();}
    while(isdigit(c)){ret=(ret<<1)+(ret<<3)+(c^48);c=getchar();}
    ret=pd?-ret:ret;
}
ll n,m,x,y,a[N],st[N],ed[N],cnt,lis[N],dep[N],son[N],siz[N],top[N],f[N],b[N],zxq,len,p[N],now,num[N];
vector<ll>v[N];
bool vst[N];
inline void dfs1(re ll ver,re ll fa)
{
	f[ver]=fa;
	dep[ver]=dep[fa]+1;
	siz[ver]=1;
	for(re int i=0;i<v[ver].size();i++)
	{
		re ll to=v[ver][i];
		if(to==fa)
			continue; 
		dfs1(to,ver);
		siz[ver]+=siz[to];
		if(siz[to]>siz[son[ver]])
			son[ver]=to;
	}
	return;
}
inline void dfs2(re ll ver,re ll fa,re ll tp)
{
	top[ver]=tp;
	st[ver]=++cnt;
	lis[cnt]=ver;
	if(son[ver])
		dfs2(son[ver],ver,tp);
	for(re int i=0;i<v[ver].size();i++)
	{
		re ll to=v[ver][i];
		if(to==fa||to==son[ver])
			continue;
		dfs2(to,ver,to);
	}
	ed[ver]=++cnt;
	lis[cnt]=ver;
	return;
}
inline ll lca(re ll x,re ll 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])
		swap(x,y);
	return x;
}
struct query
{
	ll l,r,t,ans,lca;
	inline friend operator <(re query x,re query y)
	{
		if(p[x.l]==p[y.l])
			return x.r<y.r;
		return p[x.l]<p[y.l];	
	}
}q[N];
inline bool cmp(re query x,re query y)
{
	return x.t<y.t;
}
inline void add(re ll pos)
{
	num[a[pos]]++;
	if(num[a[pos]]==1)
		now++;
	return;
}
inline void del(re ll pos)
{
	num[a[pos]]--;
	if(!num[a[pos]])
		now--;
	return;
}
int main()
{
	read(n);
	read(m);
	len=(n<<1)/sqrt(m)+1;
	for(re int i=1;i<=n;i++)
		read(a[i]),b[i]=a[i];
	sort(b+1,b+n+1);
	zxq=unique(b+1,b+n+1)-b-1;
	for(re int i=1;i<=n;i++)
		a[i]=lower_bound(b+1,b+zxq+1,a[i])-b;
	for(re int i=1;i<n;i++)
	{
		read(x);
		read(y);
		v[x].push_back(y);
		v[y].push_back(x);
	}
	dfs1(1,0);
	dfs2(1,0,1);
	for(re int i=1;i<=m;i++)
	{
		read(x);
		read(y);
		re ll tmp=lca(x,y);
		if(dep[x]>dep[y])
			swap(x,y);
		q[i].t=i;
		q[i].ans=0;
		q[i].lca=tmp;
		if(tmp==x)
			q[i].l=st[x],q[i].r=st[y];
		else
		{
			if(st[x]>st[y])
				swap(x,y);
			q[i].l=ed[x],q[i].r=st[y];
		}
	}
	for(re int i=1;i<=(n<<1);i++)
		p[i]=(i-1)/len+1;
	sort(q+1,q+m+1);
	re ll l=2,r=1;
	for(re int i=1;i<=m;i++)
	{
		while(l>q[i].l)
		{
			l--;
			if(!vst[lis[l]])
				add(lis[l]);
			else
				del(lis[l]);
			vst[lis[l]]^=1;
		}
		while(l<q[i].l)
		{
			if(!vst[lis[l]])
				add(lis[l]);
			else
				del(lis[l]);
			vst[lis[l]]^=1;
			l++;
		}
		while(r>q[i].r)
		{
			if(!vst[lis[r]])
				add(lis[r]);
			else
				del(lis[r]);
			vst[lis[r]]^=1;
			r--;
		}
		while(r<q[i].r)
		{
			r++;
			if(!vst[lis[r]])
				add(lis[r]);
			else
				del(lis[r]);
			vst[lis[r]]^=1;
		}
		add(q[i].lca);
		q[i].ans=now;
		del(q[i].lca);
	}
	sort(q+1,q+m+1,cmp);
	for(re int i=1;i<=m;i++)
		printf("%lld\n",q[i].ans);
    exit(0);
}


2021/2/18 09:53
加载中...