题意:给你n个矩形的左下坐标和右上坐标,问他们是否有相交的,有就输出1,否则输出0;
分析:考虑按x坐标排序,那么y坐标就可转化成线段,考虑结合扫描线,用树状数组维护每个点被覆盖的次数;插入矩形的边时,先查询是否会出现相交,再进行更新,删除矩形的边时,先删除,再查询;
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+7;
int tree[maxn*2],refl[maxn*2];
struct node{int y1,y2,x,op;} g[maxn*2];
bool cmp(node A,node B) {return A.x<B.x;}
int lowbit(int x) {return x&(-x);}
int tot=0;
int query(int x)
{
int res=0;
while(x) res+=tree[x],x-=lowbit(x);
return res;
}
int update(int x,int num) {while(x<=tot) tree[x]+=num,x+=lowbit(x);}
int main()
{
int n;scanf("%d",&n);
for (int i=1;i<=n;i++)
{
int x1,y1,x2,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
g[i]={y1,y2,x1,1};g[i+n]={y1,y2,x2,0};
refl[++tot]=x1;refl[++tot]=x2;refl[++tot]=y1;refl[++tot]=y2;
}
sort(g+1,g+1+2*n,cmp);
sort(refl+1,refl+1+tot);
int flag=0;
for (int i=1;i<=2*n;i++)
{
int up=lower_bound(refl+1,refl+1+tot,g[i].y2)-refl;
int down=lower_bound(refl+1,refl+1+tot,g[i].y1)-refl;
int k1,k2;
if(g[i].op==1)
{
k1=query(up);k2=query(down);
if(k1-k2>0) {flag=1;break;}
update(up,1);update(down,1);
}
else
{
update(up,-1);update(down,-1);
k1=query(up);k2=query(down);
if(k1-k2>0) {flag=1;break;}
}
if(flag) break;
}
printf("%d\n",flag);
return 0;
}