莫名CE....
查看原帖
莫名CE....
182101
逆天峰王者楼主2020/5/6 09:49
//不等,不问,不犹豫,不回头.
#include<bits/stdc++.h>
#define _ 0
#define db double
#define RE register
#define ll long long
#define P 1000000007
#define INF 1000000000
#define get(x) x=read()
#define PLI pair<ll,int>
#define PII pair<int,int>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define pb(x) push_back(x)
#define ull unsigned long long
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define rep(i,x,y) for(RE int i=x;i<=y;++i)
#define fep(i,x,y) for(RE int i=x;i>=y;--i)
#define go(x) for(int i=link[x],y=a[i].y;i;y=a[i=a[i].next].y)
using namespace std;
const int N=40010,M=1e5+10;
int link[N],tot,n,m,b[N],d[N],ct,ou[N<<1],num,first[N],last[N],f[N][25],deep[N];
int cnt[N],vis[N],c[M],belong[N],block,now;
struct edge{int y,next;}a[N<<1];
struct wy{int l,r,id,lc;}q[M];

inline int read()
{
	int x=0,ff=1;
	char ch=getchar();
	while(!isdigit(ch)) {if(ch=='-') ff=-1;ch=getchar();}
	while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*ff;
}

inline int find(int x){return lower_bound(b+1,b+ct+1,x)-b;}

inline void add(int x,int y)
{
	a[++tot].y=y;a[tot].next=link[x];link[x]=tot;
	a[++tot].y=x;a[tot].next=link[y];link[y]=tot;
}

inline void dfs(int x,int fa)
{
	ou[++num]=x;first[x]=num;
	go(x)
	{
		if(y==fa) continue;
		deep[y]=deep[x]+1;
		f[y][0]=x;
		rep(j,1,20) f[y][j]=f[f[y][j-1]][j-1];
		dfs(y,x);
	}
	ou[++num]=x;last[x]=num;
}

inline int lca(int a,int b)
{
	if(deep[a]>deep[b]) swap(a,b);
	fep(i,20,0) if(deep[f[b][i]]>=deep[a]) b=f[b][i];
	if(a==b) return a;
	fep(i,20,0) if(f[a][i]!=f[b][i]) a=f[a][i],b=f[b][i];
	return f[a][0];
}

inline bool cmp(wy a,wy 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));
}

inline void work(int x)
{
	if(vis[x]){cnt[d[x]]--;if(!cnt[d[x]]) now--;}
	else{if(!cnt[d[x]]) now++;cnt[d[x]]++;}
	vis[x]^=1;
}

inline void build()
{
	block=sqrt(n<<1);
	rep(i,1,n<<1) belong[i]=(i-1)/block+1;
}

int main()
{
	//freopen("1.in","r",stdin);
	get(n);get(m);
	build();
	rep(i,1,n) get(d[i]),b[i]=d[i];
	sort(b+1,b+n+1);
	ct=unique(b+1,b+n+1)-b-1;
	rep(i,1,n-1)
	{
		int get(x),get(y);
		add(x,y);
	}
	deep[1]=1;dfs(1,0);
	rep(i,1,m)
	{
		int get(l),get(r),lc=lca(l,r);
		if(first[l]>first[r]) swap(l,r);
		if(lc==l)
		{
			q[i].l=first[l];
			q[i].r=first[r];
		}
		else 
		{
			q[i].l=last[l];
			q[i].r=first[r];
			q[i].lc=lc;
		}
		q[i].id=i;
	}
	sort(q+1,q+m+1,cmp);
	int l=1,r=0;
	rep(i,1,m)
	{
		int ql=q[i].l,qr=q[i].r,lc=q[i].lc;
		while(l<ql)	work(ou[l++]);
		while(l>ql) work(ou[--l]);
		while(r<qr) work(ou[++r]);
		while(r>qr) work(ou[r--]);
		if(lc) work(lc);
		c[q[i].id]=now;
		if(lc) work(lc);

	}
	rep(i,1,m) put(c[i]); 
	return (0^_^0);
}
//以吾之血,祭吾最后的亡魂



疯狂CE,求助大佬...

2020/5/6 09:49
加载中...