题目大意
一个矩形,n个数字填入了其中,每个数字出现两次。
对于一对相同的数字,使用一条极端细的可弯曲的线连起来(不允许出矩形)。
是否存在一种连线方案使得任意两条线不相交。
做法
只有两个数字都在矩形边界上,连线会分割矩形。
不妨先不连这些数字对,最后再来连。
于是你可以发现只要这些数字对能合法就能合法。
按顺时针做个栈贪心就好了。
#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int maxn=200000+10;
struct dong{
int id,x,y;
} p[maxn],p1,p2;
struct suan{
dong x,y;
} a[maxn];
int sta[maxn];
int i,j,k,l,t,n,m,x,y,r,c,tot,top;
bool is(dong x){
return x.x==0||x.y==0||x.x==r||x.y==c;
}
int sum(dong x){
if(x.x==0) return 2*r+c+c-x.y;
if(x.y==0) return x.x+x.y;
if(x.x==r) return r+x.y;
if(x.y==c) return r+c+r-x.x;
}
bool cmp(dong a,dong b){
return sum(a)<sum(b);
}
int main(){
scanf("%d%d%d",&r,&c,&n);
fo(i,1,n){
scanf("%d%d",&x,&y);
p1=(dong){i,x,y};
scanf("%d%d",&x,&y);
p2=(dong){i,x,y};
a[i]=(suan){p1,p2};
if (is(p1)&&is(p2)){
p[++tot]=p1;
p[++tot]=p2;
}
}
sort(p+1,p+tot+1,cmp);
fo(i,1,tot){
if (top&&sta[top]==p[i].id) top--;
else sta[++top]=p[i].id;
}
if (top) printf("NO\n");else printf("YES\n");
}