Gym324843D

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;
}
posted @ 2021-04-17 20:53  yesuweiYYYY  阅读(44)  评论(0编辑  收藏  举报