Codeforces 1196C. Robot Breakout

传送门

维护合法区域的四个边 $xa,ya,xb,yb$

表示在以 $(xa,ya)$ 为左下角,以 $(xb,yb)$ 为右上角的矩形内的点都是合法答案

对于一个起点 $(x,y)$,如果没法往左,那么 $xa$ 就不能小于 $x$ ,如果没法往右,那么 $xb$ 就不能大于 $x$

反之可以,十分显然

对于 $y$ 也是同样的讨论一下即可

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
    while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
    return x*f;
}
const int N=2e5+7;
int Q,n;
int main()
{
    Q=read();
    while(Q--)
    {
        n=read(); int xa,ya,xb=-100000,yb=-100000,xc=100000,yc=100000;
        for(int i=1;i<=n;i++)
        {
            xa=read(),ya=read();
            if(!read()) xb=max(xb,xa);
            if(!read()) yc=min(yc,ya);
            if(!read()) xc=min(xc,xa);
            if(!read()) yb=max(yb,ya);
        }
        if(xb>xc||yb>yc) { printf("0
"); continue; }
        printf("1 %d %d
",xb,yb);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/LLTYYC/p/11603092.html