Gym324843D
交互,构造。
题意:
在106 * 106的平面中,存在n个点。
你每次询问(x,y) 系统会高呼你一个D,为(x,y)到最近的点的距离的平方。
每当你找到一个点的准确位置以后,当你继续查找时,系统不会再考虑这个点了。
解:
1.随便查询一个点(x,y),得到一个d
2.继续查询以(x,y)为原心,sqrt(d)为半径的圆的上下左右四个点。
3.在这个四个点中选用查询所得D最小的点,重复至第一步
循环这个过程,D不断减小。
#include <bits/stdc++.h>
using namespace std;
const long long N = 1000010;
void in(long long &x){
x=0;char c=getchar();
long long y=1;
while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
x*=y;
}
void o(long long x){
if(x<0){x=-x;putchar('-');}
if(x>9)o(x/10);
putchar(x%10+'0');
}
long long n;
bool flag;// flag == true == 出现0 == 找到了点
long long qur(long long x,long long y){//询问一次
x=max(x,(long long)0);x=min((long long)1000000,x);//处理x边界
y=max(y,(long long)0);y=min((long long)1000000,y);//处理y边界
o(x);putchar(' ');o(y);cout<<endl;//查询
long long res;in(res);
if(res==0)flag=true;//找到了!
return res;返回
}
long long a[N];
map<long long,long long>mp;
long long dx[10];
long long dy[10];
long long dis[10];
void Q(){
long long x=0,y=0;
long long d = qur(x,y);if(flag)return;
while(d!=0){//找圆上四个的
long long dd = sqrt(d);
dx[1]=-dd;dx[2]=dd;dx[3]=0;dx[4]=0;
dy[1]=0;dy[2]=0;dy[3]=-dd;dy[4]=dd;
for(long long i=1;i<=4;i++){
dis[i]=qur(x+dx[i],y+dy[i]);if(flag)return;//查找并记录四个点的回复
}
//找到最后小的一个点
long long mindd=dis[1];
for(long long i=1;i<=4;i++){
mindd=min(mindd,dis[i]);
}
//若没找到,重制(x,y),继续循环。
for(long long i=1;i<=4;i++){
if(mindd==dis[i]){
x+=dx[i];y+=dy[i];
x=max(x,(long long)0);x=min((long long)1000000,x);
y=max(y,(long long)0);y=min((long long)1000000,y);
break;
}
}
d=mindd;
}
}
signed main(){
in(n);//读入
while(n--){
flag=false;//重制
Q();//
}
return 0;
}