题目来源:codeforces1039B Subway Pursuit

题目大意:
在1到n里有一个运动的点,要求找到这个点,每次可以查询一个区间内有没有这个点,每次这个点往左或者往右移动1到k个位置,要求要在4500次查询内找到这个点的位置
输入格式:
一行两个整数n,k
输出格式:
每行输出两个整数l,r表示查询区间

表示蒟蒻一直不知道交互题怎么做......而且看到原题的超长英文内心也是懵逼的......真的是什么都不会......

最后终于会做了!(假的,其实是抄了题解啊)所以就特来写一篇博客记录一下。

对于这个题呢,其实官方tutorial是这样说的:

Notice that we can make segment in which we are located small enough using binary search. Let [l;r] be the last segment about which we knew for sure that train is in it (at the beginning it's [1;n]). Let m=l+r2. Let's ask about segment [l;m]. If we receive answer «YES», after this query train for sure will be in segment [l−k;m+k], otherwise in [m−k;r+k]. So, after each query length of segment is divided by 2 and increased by 2k. After segment length becomes irreducible (4k), let's ask about some random station in this segment. If we guessed right, let's finish the program, otherwise make the binary search again.
To get the OK let's make one more observation: for all binary searches except the first one initial segment can be made [l−k;r+k]
instead of [1;n].

也就是二分的意思。

因为每次一个区间分成两半,每一半的两端都会因为k的存在,而两端分别增加k个单位长度,也就是每一次增加4k个单位长度。

那么在区间长度大于4k的时候我们显然可以二分处理,但是之后在区间长度小于等于4k的时候可以考虑使用随机化进行询问。

题目要求我们在l==r且回答询问为True的时候结束程序,所以记得要及时判断is_solved变量并及时return掉。

#include<iostream>
#include<vector>
#include<random>
#include<ctime>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
bool is_solved = false;
bool Request(long long a, long long b){cout<<a<<' '<<b<<endl;string answer;cin>>answer;if(answer=="Yes"&&a==b)is_solved=true;return answer=="Yes";
}
void Solve(long long n,int k){long long min_x=1,max_x=n;while (!is_solved){if (max_x-min_x<=k*4){if (k==0){Request(min_x,max_x);return;} long long a=max_x-min_x+1;long long b=min_x+(((long long)rand()*rand())%a+a)%a;Request(b,b);if (is_solved)return;min_x=max(min_x-k,(long long)1);max_x=min(max_x+k,n);}long long middle_x=(min_x + max_x)/2;if (Request(min_x,middle_x)){min_x=max((long long)1,min_x-k);max_x=min(middle_x + k,n);}else{min_x=max((long long)1,middle_x+1-k);max_x=min(n,max_x+k);}}
}
int main(){long long n;int k;cin >>n>>k;Solve(n,k);
}

转载于:https://www.cnblogs.com/fengxunling/p/9605647.html

Subway Pursuit (二分)(交互题)相关推荐

  1. 【交互题+二分】Codeforces Round #516 E. Dwarves, Hats and Extrasensory Abilities

    Codeforces Round #516 E. Dwarves, Hats and Extrasensory Abilities 题意: 输出一个点,输入是黑色或者白色,n次询问后,输出一条直线,是 ...

  2. codeforces 1039B Subway Pursuit【二分+随机】

    题目:戳这里 题意:一个点在[1,n]以内,我们可以进行4500次查询,每次查询之后,该点会向左或向右移动0~k步,请在4500次查询以内找到该点. 解题思路:一边二分,一边随机. 交互题似乎有好多是 ...

  3. Codeforces1486 C1.Guessing the Greatest (easy version)(交互题+二分)

    原题链接 题意: 交互题,首先电脑给出序列的长度n.你可以询问区间[l,r]的次大值位置,求序列最大值的位置. 思路: 首先考虑最简单的情况,当区间长度为2时,那么假设区间为[l,r].当询问的次大值 ...

  4. Codeforces ~ 1063C ~ Dwarves, Hats and Extrasensory Abilities (交互题,二分)

    题意 交互题.N次,让你每次输出一个点的坐标,然后他告诉你当前点的颜色(黑或白).使得可以找到一条直线把黑点和白点分隔开.最终输出这条直线过的两个点.输入输出均为正数,分为为0~1e9 思路 我们把所 ...

  5. CF1039B:交互题+二分

    CF1039B 题解: 第二次做交互题,对交互题没什么感觉.你要询问系统,所以你cout输入,系统再立刻给你cin答案.交互题格式就在于要清空缓存区,可以在printf输出完之后,加一fflush(s ...

  6. Codeforces Round #503 (by SIS, Div. 2) D. The hat(交互题)

    题目链接:http://codeforces.com/contest/1020/problem/D 题意描述: 这是一个交互题,互交题就是你要输出一些问题,评测机就会回答你一些问题 你要在规定的提问次 ...

  7. Codeforces Round #504 E - Down or Right 交互题

    1023E 题意: 交互题.在一个有障碍地图中,问如何走才能从(1,1)走到(n,n),只能向右或者向左走.每次询问两个点,回复你这两个点能不能走通. 思路: 只用最多2*n-2次询问.从(1,1), ...

  8. Strange Shuffle CodeForces - 1471E(交互题)

    交互题 这类型不同于普通的题. 可以理解为有个问题需要你解决,你通过输入某些东西表示你要问系统的问题,这时系统会回答你的问题.在代码中的回答方式就是会输入某个东西就是系统给你的答案,通过这些信息你可以 ...

  9. Codeforces#1157 F. Ehab and the Big Finale (思维+交互题)

    链接: http://codeforces.com/contest/1174/problem/F 题意: 给你一颗树,需要你求出某个已知点,你有两种询问操作 问你能否在36次询问之内得知所求点 思路: ...

  10. D1. RPD and Rap Sheet (Easy Version) (交互题+构造)

    题意: 交互题,有一个初始密码xxx,只有nnn次猜测机会,假如猜了yyy,x!=yx!=yx!=y,那么密码就会变成x⨁yx\bigoplus yx⨁y. 题解: 设第iii次猜测的数为pip_ip ...

最新文章

  1. OpenGl的glMatrixMode()函数理解
  2. 【Open Search产品评测】-- 淘点点:基于OpenSearch,轻松实现一整套O2O类
  3. vb初学者编程代码大全_学习VB编程第14天,一个简单的排序代码把我难住了
  4. ON REG EXPRESSION.SYNTAX
  5. httpservletrequest_了解HttpServletRequest 对象 基本应用
  6. 多线程基础知识了解一下
  7. VMware Workstation 虚拟机性能优化指南
  8. 论文浅尝 | GMNN: Graph Markov Neural Networks
  9. PyTorch 1.0 中文官方教程:序列模型和LSTM网络
  10. xboxones手柄驱动_微软Xbox One S全数字版再次发售,1043元
  11. xampp 2016支持php7.0,xampp 装php7
  12. 中文python笔记
  13. 配置JDK环境变量(详细图文教程)
  14. [错误记录]The ‘typing‘ package is an obsolete backport of a standard library package
  15. 李沐动手学深度学习V2-attention注意力机制
  16. 华三虚拟机服务器型号,03-虚拟机配置
  17. Universal Termsrv.dll Patch 是个好东西
  18. 汇编语言第4周学生总结反馈
  19. artifact is missing.
  20. Locust 压力测试工具学习(一)

热门文章

  1. FR两个相同字符如何提取第二个字符后内容
  2. windows下如何用python抓取邮件内容和附件_用python下载邮件内容
  3. Windows上的Spark环境搭建后,运行时报错的问题
  4. Linux-nginx安装
  5. python学习笔记-递归函数
  6. ElasticSearch(1)CentOS安装ElasticSearch测试CRUD
  7. 机器学习算法与Python学习
  8. oracle数据库学习相关笔记-相关约束
  9. Mybatis缓存机制及mybatis的各个组成部分
  10. 在mysql 使用binlog日志