有没有大佬帮我康康又臭又长的代码呢/ts
查看原帖
有没有大佬帮我康康又臭又长的代码呢/ts
132976
huayucaiji楼主2020/6/8 18:24

rt,THX

#include<bits/stdc++.h>
using namespace std;

const int maxn=4e4+10;

struct edge {
	int v,next;
}e[maxn<<1];
struct Query {
	int l,r,bel,id,Lca;
}q[maxn*20];

bool cmp(Query a,Query b) {
	if(a.bel!=b.bel) {
		return a.bel<b.bel;
	}
	return a.r<b.r;
}

int cnt,h[maxn],cur,euler[maxn<<1],n,m,v[maxn],num[maxn],tmp[maxn],app[maxn],f[maxn][21],dep[maxn],ans[maxn],st[maxn],ed[maxn];

void addedge(int u,int v) {
	e[++cnt].v=v;
	e[cnt].next=h[u];
	h[u]=cnt;
}
void insert(int u,int v) {
	addedge(u,v);
	addedge(v,u);
}

void dfs(int u,int fa) {
	euler[++cnt]=u;
	st[u]=cnt;
	for(int i=h[u];i;i=e[i].next) {
		int v=e[i].v;
		if(v!=fa) {
			dep[v]=dep[u]+1;
			f[v][0]=u;
			dfs(v,u);
		}
	}
	euler[++cnt]=u;
	ed[u]=cnt;
}

int lca(int x,int y) {
	if(dep[x]<dep[y]) {
		swap(x,y);
	}
	for(int i=18;i>=0;i--) {
		if(dep[f[x][i]]>=dep[y]) {
			x=f[x][i];
		}
	}
	
	for(int i=18;i>=0;i--) {
		if(f[x][i]!=f[y][i]) {
			x=f[x][i];
			y=f[y][i];
		}
	}
	
	return f[x][0];
}

void mod(int y,int pos) {
	y=v[y];
	if(app[euler[pos]]==1) {
    	num[y]--;
    	app[euler[pos]]--;
  		if (num[y] == 0)
        	cur--;
    }
    else {
    	num[y]++;
    	app[euler[pos]]++;
    	if (num[y] == 1)
       		cur++;
	}
}

int main() {
	freopen("in.txt","r",stdin);
	scanf("%d%d",&n,&m);
	int block=sqrt(n);
	for(int i=1;i<=n;i++) {
		scanf("%d",&v[i]);
		tmp[i]=v[i];
	}
	
	sort(tmp+1,tmp+n+1);
	int k=unique(tmp+1,tmp+n+1)-tmp-1;
	for(int i=1;i<=n;i++) 
		v[i]=lower_bound(tmp+1,tmp+k+1,v[i])-tmp;    
	
	for(int i=1;i<n;i++) {
		int a,b;
		scanf("%d%d",&a,&b);
		insert(a,b);
	}
	
	cnt=0;
	dfs(1,0);
	
	for(int i=1;i<=18;i++) {
		for(int j=1;j<=n;j++) {
			f[j][i]=f[f[j][i-1]][i-1];
		}
	}
	
	cnt=0;
	for(int i=1;i<=m;i++) {
		int a,b;
		scanf("%d%d",&a,&b);
		if(dep[a]<dep[b]) {
			swap(b,a);
		}
		
		int LCA=lca(a,b);
		if(LCA==b) {
			q[i].l=st[b];
			q[i].r=st[a];
			q[i].bel=(q[i].l+1)/block+1;
			q[i].id=i;
			q[i].Lca=-1;
		}
		else {
			if(ed[b]>st[a]) {
				swap(a,b);
			}
			q[i].l=ed[b];
			q[i].r=st[a];
			q[i].bel=(q[i].l+1)/block+1;
			q[i].id=i;
			q[i].Lca=LCA;
		}
	}
	
	sort(q+1,q+m+1,cmp);
	/*for(int i=1;i<=n*2;i++) {
		cout<<euler[i]<<" ";
	}*/
	
	int ll=1,rr=0;
	for(int i=1;i<=m;i++) {
		while(ll<q[i].l) {
			mod(euler[ll],ll);
			ll++;
		}
        while(ll>q[i].l) {
			mod(euler[ll-1],ll-1);
			ll--;
		}
        while(rr<q[i].r) {
			mod(euler[rr+1],rr+1);
			rr++;
		}
        while(rr>q[i].r) {
			mod(euler[rr],rr);
			rr--;
		}
        if(q[i].Lca&&num[v[q[i].Lca]]==0) {
        	ans[q[i].id]=cur+1;
		}
		else 
			ans[q[i].id]=cur;
	}
	
	for(int i=1;i<=m;i++) {
		printf("%d\n",ans[i]);
	}
	return 0;
}
//1 4 8 8 4 3 7 7 6 6 5 5 3 2 2 1
2020/6/8 18:24
加载中...