你手中挥舞的大楼,是我此生不变的信仰,唯我一方大爷永世长存
上面是题目链接,这个不是
你有好多机器人跑路了,你知道他们的坐标,由于故障这些机器人在某些方向上不能动,但是你知道他们中的每一个可以往哪个方向跑。现在你要找一个坐标,使得所有机器人都能到这个位置。
在这里思路是找每一个机器人可以到达的范围,然后这些范围相交,找到答案的范围即可。时间复杂度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;
}