题解 CF788D【Finding lines】
CF788D Finding lines解题报告:
更好的阅读体验
题意
有
分析
普通的交互题。
考虑这些直线都会与一三象限平分线
具体地,我们每次处理区间
这一部分的询问次数有点难分析(下面纯口胡):考虑
找到这些直线与
这一部分的询问次数上界为
那么总询问次数最多
代码
#include<stdio.h>
#include<vector>
using namespace std;
int no;
vector<int>ans,X,Y;
int ask(int x,int y){
printf("0 %d %d\n",x,y);
fflush(stdout);
int res;
scanf("%d",&res);
return res;
}
void solve(int l,int r){
if(l>r)
return ;
int mid=(l+r)>>1,res=ask(mid,mid);
if(res==0)
ans.push_back(mid),res=1;
else no=mid;
solve(l,mid-res),solve(mid+res,r);
}
int main(){
solve(-100000000,100000000);
for(int i=0;i<ans.size();i++){
if(ask(ans[i],no)==0)
X.push_back(ans[i]);
if(ask(no,ans[i])==0)
Y.push_back(ans[i]);
}
printf("1 %d %d\n",X.size(),Y.size());
for(int i=0;i<X.size();i++)
printf("%d%c",X[i],i==X.size()-1? '\n':' ');
for(int i=0;i<Y.size();i++)
printf("%d%c",Y[i],i==Y.size()-1? '\n':' ');
return 0;
}