洛谷 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\n",ans); 34 return 0; 35 }