原题链接:http://codeforces.com/contest/788/problem/D
题解:
首先,可以发现,无论是平行x轴还是平行y轴的直线,都与对角线相交,所以我们可以在对角线上进行二分,可以二分得到所有的交点,然后只需判断是平行x轴还是平行y轴就可,考虑在对角线上找一个没有相交的点,坐标为(z,z),则对于任一个二分得到的交点(x,x),查询(x,z)和(z,x)如果(x,z)为零,则存在一条直线平行y轴,如果(z,x)为零,则存在一条直线平行于x轴,输出答案即可。
#include<bits/stdc++.h>
using namespace std;
int query(int x,int y)
{
int ret;
printf("0 %d %d\n",x,y);
fflush(stdout);
scanf("%d",&ret);
return ret;
}
vector<int> ans,X,Y;
int blk=1e8;
void solve(int l,int r)
{
if(l>r)
return;
int m=(l+r)>>1;
//printf("%d %d",l,r);
int d=query(m,m);
if(!d)
{
ans.push_back(m);
d=1;
}
else
{
blk=m;
}
solve(l,m-d);
solve(m+d,r);
}
void getxy()
{
for(int i=0;i<ans.size();i++)
{
if(!query(ans[i],blk))
X.push_back(ans[i]);
if(!query(blk,ans[i]))
Y.push_back(ans[i]);
}
printf("1 %d %d\n",X.size(),Y.size());
fflush(stdout);
for(int i=0;i<X.size();i++)
{
printf("%d ",X[i]);
fflush(stdout);
}
printf("\n");
fflush(stdout);
for(int i=0;i<Y.size();i++)
{
printf("%d ",Y[i]);
fflush(stdout);
}
printf("\n");
fflush(stdout);
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
solve(-1e8,1e8);
getxy();
return 0;
}