canvas dClock
您的浏览器太古董了,升级吧!

CF 292 D.Connected Components

CF 292 D

Solution:

并不是不会合并并查集.

而是数组开小了哦.

然后并不是RE了哟.

WAWAWAWA

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
const int MAXN=500;
const int MAXM=20000;
int n,m,k;
int u[MAXM+10],v[MAXM+10];
int s0[MAXM+10][MAXN+10],s1[MAXM+10][MAXN+10];
int p[MAXN+10];
int* fa;
int find(int x){return (fa[x]==x)?x:(fa[x]=find(fa[x]));}
void hb(int x,int y)
{
	x=find(x);y=find(y);
	if(x!=y)fa[x]=y;
}
int main(void)
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;++i)scanf("%d%d",u+i,v+i);
	for(int i=1;i<=n;++i)s0[0][i]=s1[m+1][i]=i;
	for(int i=1;i<=m;++i)
	{
		for(int j=1;j<=n;++j)s0[i][j]=s0[i-1][j];
		fa=s0[i];
		hb(u[i],v[i]);
		for(int j=1;j<=n;++j)find(j);
	}
	for(int i=m;i;--i)
	{
		for(int j=1;j<=n;++j)s1[i][j]=s1[i+1][j];
		fa=s1[i];
		hb(u[i],v[i]);
		for(int j=1;j<=n;++j)find(j);
	}
	scanf("%d",&k);
	while(k--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		for(int i=1;i<=n;++i)p[i]=i;
		fa=p;
		for(int i=1;i<=n;++i)hb(s0[l-1][i],i);
		for(int i=1;i<=n;++i)hb(s1[r+1][i],i);
		int ans=0;
		for(int i=1;i<=n;++i)if(p[i]==i)++ans;
		printf("%d\n",ans);
	}
	return 0;
}
posted @ 2017-09-22 16:23  DOlaBMOon  阅读(228)  评论(0编辑  收藏  举报