把每个横坐标边,纵坐标边分别排序,判断是否相邻即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=25e3+9;
int n;
bool use[maxn];
struct
{
int a,b,c,d;
}data[maxn];
struct A
{
int key,down,up,id;
bool operator <(const A & xx) const
{
if(key==xx.key) return down<xx.down;
return key<xx.key;
}
}a[maxn<<1];
int main()
{
// freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d %d",&data[i].a,&data[i].b);
scanf("%d %d",&data[i].c,&data[i].d);
}
memset(use,0,sizeof(use));
for(int i=1;i<=n;i++)
{
a[i*2-1].key=data[i].a;
a[i*2-1].down=data[i].b;
a[i*2-1].up=data[i].d;
a[i*2].key=data[i].c;
a[i*2].down=data[i].b;
a[i*2].up=data[i].d;
a[i*2].id=a[i*2-1].id=i;
}
sort(a+1,a+n+n+1);
for(int i=1,j;i<=n+n;i=j)
{
for(j=i;j<=n+n;j++)
if(a[i].key!=a[j].key) break;
int up=a[i].up;
for(int k=i+1;k<j;k++)
{
if(a[k].down<=up)
use[a[k].id]=use[a[k-1].id]=1;
up=max(up,a[k].up);
}
}
for(int i=1;i<=n;i++)
{
a[i*2-1].key=data[i].b;
a[i*2-1].down=data[i].a;
a[i*2-1].up=data[i].c;
a[i*2].key=data[i].d;
a[i*2].down=data[i].a;
a[i*2].up=data[i].c;
a[i*2].id=a[i*2-1].id=i;
}
sort(a+1,a+n+n+1);
for(int i=1,j;i<=n+n;i=j)
{
for(j=i;j<=n+n;j++)
if(a[i].key!=a[j].key) break;
int up=a[i].up;
for(int k=i+1;k<j;k++)
{
if(a[k].down<=up)
use[a[k].id]=use[a[k-1].id]=1;
up=max(up,a[k].up);
}
}
int ans=0;
for(int i=1;i<=n;i++) ans+=!use[i];
cout<<ans<<endl;
}
return 0;
}