记录编号 333626 评测结果 AAAAA
题目名称 矩形 最终得分 100
用户昵称 GravatarLOSER 是否通过 通过
代码语言 C++ 运行时间 1.046 s
提交时间 2016-10-31 08:01:37 内存使用 0.47 MiB
显示代码纯文本
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 7010
int n,root[maxn],ans,a[maxn],b[maxn],c[maxn],d[maxn],rank[maxn];
struct ufs{
	int Findroot(int x){return root[x]==x?root[x]:root[x]=Findroot(root[x]);}	
	bool Judge(int x,int y){
		if(a[x]>c[y]||b[x]>d[y]||a[y]>c[x]||b[y]>d[x]) return false;
		if((a[x]==c[y]||a[y]==c[x])&&(b[x]==d[y]||b[y]==d[x])) return false;
		return true;
	}
}U;
int main(){
	freopen("recpro.in","r",stdin); freopen("recpro.out","w",stdout);
	scanf("%d",&n);
	for(int i=0;i<maxn;i++)root[i]=i,rank[i]=1;
	for(int i=1;i<=n;i++){
		root[i]=i;
		scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
	}	
	for(int i=1;i<n;i++){
		for(int j=i+1;j<=n;j++){
			int ra=U.Findroot(i),rb=U.Findroot(j);
			if(ra^rb && U.Judge(i,j)){
				if(rank[ra]<rank[rb]) root[ra]=rb,rank[rb]+=rank[ra];
				else root[rb]=ra,rank[ra]+=rank[rb];
			}
		}	
	}	for(int i=1;i<=n;i++) ans+=root[i]==i;
	printf("%d\n",ans);
	getchar();getchar();
	return 0;	
}