codeforces575C. Robot Breakout

你手中挥舞的大楼,是我此生不变的信仰,唯我一方大爷永世长存
上面是题目链接,这个不是

你有好多机器人跑路了,你知道他们的坐标,由于故障这些机器人在某些方向上不能动,但是你知道他们中的每一个可以往哪个方向跑。现在你要找一个坐标,使得所有机器人都能到这个位置。


在这里思路是找每一个机器人可以到达的范围,然后这些范围相交,找到答案的范围即可。时间复杂度O(n)。
首先根据每一个机器人的信息确定其可移动范围。然后主题要问题在于如何判断相交。
我使用的是判断是否不相交取反。因为相交的话包括相交何包含,感觉比较费劲,所以懒得直接判断 形式简捷,推荐使用。
然后在确定相交的基础上取交集,更新答案的范围。


#pragma GCC diagnostic error "-std=c++11"
#include <bits/stdc++.h>
#define OO 100000
#define ll long long
#define Pair pair<int,int>
#define re return

#define getLen(name,index) name[index].size()
#define mem(a,b) memset(a,b,sizeof(a))
#define Make(a,b) make_pair(a,b)
#define Push(num) push_back(num)
#define rep(index,star,finish) for(register int index=star;index<finish;index++)
#define drep(index,finish,star) for(register int index=finish;index>=star;index--)
using namespace std;
const int maxn=1e5+5;
template<class T> void _deb(const char *name,T val){
    cout<<name<<val<<endl;
}
struct Rect{
    int x1,y1,x2,y2;
    void set(int X1,int Y1,int X2,int Y2){
        x1=X1,y1=Y1,x2=X2,y2=Y2;
    }
};

Rect rect[maxn];
inline bool intersect(const Rect& A,const Rect& B);
int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int t;
    cin>>t;
    while(t--){
        int N;
        cin>>N;
        rep(i,0,N){
            int x,y;
            cin>>x>>y;
            rep(f,1,5){
                int flag;
                cin>>flag;

                switch(f){
                    case 1:
                       if(flag){
                            rect[i].x1= -OO;
                       }else{
                            rect[i].x1=x;
                       }
                       break;
                    case 2:
                        if(flag){
                            rect[i].y2= OO;
                        }else{
                            rect[i].y2=y;
                        }
                        break;
                    case 3:
                        if(flag){
                            rect[i].x2=OO;
                        }else{
                            rect[i].x2=x;
                        }
                        break;
                    case 4:
                        if(flag){
                            rect[i].y1= -OO;
                        }else{
                            rect[i].y1=y;
                        }
                        break;
                }


            }
        }

        bool impossible=false;
        Rect area;area.set(-OO,-OO,OO,OO);
        rep(i,0,N){
            if(intersect(area,rect[i])){
                area.set(max(area.x1,rect[i].x1),max(area.y1,rect[i].y1),min(area.x2,rect[i].x2),min(area.y2,rect[i].y2));
            }else{
                impossible=true;
                break;
            }
        }

        if(impossible){
            cout<<0<<endl;
        }else{
            cout<<1<<" "<<(area.x1+area.x2)/2<<" "<<(area.y1+area.y2)/2<<endl;
        }

    }

    re 0;
}
inline bool intersect(const Rect& A,const Rect& B){
    bool ans= A.y2<B.y1 || A.x2<B.x1 || B.y2<A.y1 || B.x2<A.x1;
    re !ans;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值