洛谷 2449 [SDOI2005]矩形

【题解】

  因为这道题中n比较小,n^2效率是可以接受的。

  枚举两个矩形,如果它们有重叠部分,就用并查集合并一下即可。

  

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define N 8000
 4 #define rg register
 5 using namespace std;
 6 int n,fa[N],ans;
 7 struct rec{
 8     int x,y,xx,yy;
 9 }a[N];
10 inline int read(){
11     int k=0,f=1; char c=getchar();
12     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
13     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
14     return k*f;
15 }
16 inline int find(int x){
17     return fa[x]==x?x:fa[x]=find(fa[x]);
18 }
19 inline bool in(int s1,int s2){
20     if(a[s1].x>a[s2].x||(a[s1].x==a[s2].x&&a[s1].y>a[s2].y)) swap(s1,s2);
21     if(a[s1].xx>a[s2].x&&a[s1].yy>a[s2].y) return 1;
22     return 0;
23 }
24 int main(){
25     n=read();
26     for(rg int i=1;i<=n;i++) 
27         a[i].x=read(),a[i].y=read(),a[i].xx=read(),a[i].yy=read();
28     for(rg int i=1;i<=n;i++) fa[i]=i;
29     for(rg int i=1;i<n;i++)
30         for(rg int j=i+1;j<=n;j++)
31         if(in(i,j)) fa[find(i)]=find(j);
32     for(rg int i=1;i<=n;i++) if(fa[i]==i) ans++;
33     printf("%d
",ans);
34     return 0;
35 }
View Code
原文地址:https://www.cnblogs.com/DriverLao/p/8692723.html