[luogu 2449] [SDOI2005]矩形 {并查集}

题目

https://www.luogu.org/problem/P2449


解题思路

并查集,易做。
需要注意判断矩形之间的相交的条件。


代码

#include<cstdio> 
#include<algorithm>
#define rep(i,x,y) for(register int i=x;i<=y;i++)
using namespace std; 
struct node{
	int x,y,xx,yy; 
}a[7005];
int n,f[7005],ans; 
int find(int x){
	return (f[x]==x)?x:(f[x]=find(f[x])); 
}
int main(){
	scanf("%d",&n); 
	rep(i,1,n) scanf("%d%d%d%d",&a[i].x,&a[i].y,&a[i].xx,&a[i].yy),f[i]=i; 
	rep(i,1,n){
		rep(j,1,i-1) {
			int qx=find(i),qy=find(j); 
			if (qx!=qy){
				bool b=1; 
			    if ((a[i].xx<a[j].x||a[j].xx<a[i].x)||(a[i].yy<a[j].y||a[j].yy<a[i].y)) b=0;
			    if((a[i].x==a[j].xx||a[i].xx==a[j].x)&&(a[i].y==a[j].yy||a[i].yy==a[j].y)) b=0;
				if (b) f[qx]=qy; 
			}
		}
	}
	rep(i,1,n) ans+=(f[i]==i); 
	 printf("%d",ans); 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值