您的位置:首页 > 其它

hdu5486 离散化+并查集

2015-09-27 18:54 232 查看
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
#define rd(x) scanf("%d",&x)
#define rdd(x,y) scanf("%d%d",&x,&y)
#define rddd(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define rdddd(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w)
#define rds(s) scanf("%s",s)
#define rep(i,n) for(int i=0;i<n;i++)
#define LL long long
const int N = 1e6+10;
const int M=2000;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
int MOD=1e9+7;
int cas=1;
int n,m,k,q;
int a
;
int b
;
int f[N*2];
int c
;
int get(int x,int *a,int len){
return lower_bound(a+1,a+len+1,x)-a;
}
int find(int x){
if(f[x]==x) return x;
return f[x]=find(f[x]);
}
int unit(int u,int v){
int u1=find(u),v1=find(v);
if(u1!=v1){
f[u1]=v1;
}
}

int res
[2];
int main()
{
#ifndef ONLINE_JUDGE
freopen("aaa","r",stdin);
#endif
int T;
rd(T);
while(T--){
rd(n);
for(int i=1;i<=n;i++) rdd(a[i],b[i]);
for(int i=1;i<=n;i++) c[i]=a[i];
sort(c+1,c+n+1);
int lena=1;
for(int i=2;i<=n;i++) if(c[i]!=c[i-1]) c[++lena]=c[i];
for(int i=1;i<=n;i++) a[i]=get(a[i],c,lena);

for(int i=1;i<=n;i++) c[i]=b[i];
sort(c+1,c+n+1);
int lenb=1;
for(int i=2;i<=n;i++) if(c[i]!=c[i-1]) c[++lenb]=c[i];
for(int i=1;i<=n;i++) b[i]=get(b[i],c,lenb);
memset(res,0,sizeof res);
for(int i=1;i<=lena+lenb;i++) f[i]=i;
for(int i=1;i<=n;i++) unit(a[i],b[i]+lena);

for(int i=1;i<=lena;i++){
int u=find(i);
res[u][0]++;
}
for(int i=1;i<=lenb;i++){
int u=find(i+lena);
res[u][1]++;
}
int one,mer,sp;
one=mer=sp=0;
for(int i=1;i<=lena+lenb;i++)
{
int u=res[i][0];
int v=res[i][1];
if(u==1 && v==1) one++;
else if(u>1 && v==1) mer++;
else if(u==1 && v>1) sp++;
}
printf("Case #%d: %d %d %d\n",cas++,sp,mer,one);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: