题目来源: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掉。

  1. #include<iostream>
  2. #include<vector>
  3. #include<random>
  4. #include<ctime>
  5. #include<cstdio>
  6. #include<algorithm>
  7. #include<cstring>
  8. using namespace std;
  9. bool is_solved = false;
  10. bool Request(long long a, long long b){
  11. cout<<a<<' '<<b<<endl;
  12. string answer;
  13. cin>>answer;
  14. if(answer=="Yes"&&a==b)
  15. is_solved=true;
  16. return answer=="Yes";
  17. }
  18. void Solve(long long n,int k){
  19. long long min_x=1,max_x=n;
  20. while (!is_solved){
  21. if (max_x-min_x<=k*4){
  22. if (k==0){
  23. Request(min_x,max_x);
  24. return;
  25. }
  26. long long a=max_x-min_x+1;
  27. long long b=min_x+(((long long)rand()*rand())%a+a)%a;
  28. Request(b,b);
  29. if (is_solved)
  30. return;
  31. min_x=max(min_x-k,(long long)1);
  32. max_x=min(max_x+k,n);
  33. }
  34. long long middle_x=(min_x + max_x)/2;
  35. if (Request(min_x,middle_x)){
  36. min_x=max((long long)1,min_x-k);
  37. max_x=min(middle_x + k,n);
  38. }
  39. else{
  40. min_x=max((long long)1,middle_x+1-k);
  41. max_x=min(n,max_x+k);
  42. }
  43. }
  44. }
  45. int main(){
  46. long long n;
  47. int k;
  48. cin >>n>>k;
  49. Solve(n,k);
  50. }

Subway Pursuit (二分)(交互题)的更多相关文章

  1. 【ECNU3542】神奇的魔术(二分交互题)

    点此看题面 大致题意: 有一个\(1\sim 2^n\)的排列,\(n\le7\),每次交互告诉你有几个位置上的数是正确的,让你在\(1000\)轮以内猜出每个位置上的数. 二分 显然,我们可以通过二 ...

  2. Awkward Response AtCoder - 2656 ( 二分+交互题)

    Problem Statement This is an interactive task. Snuke has a favorite positive integer, N. You can ask ...

  3. CF1114E Arithmetic Progression(交互题,二分,随机算法)

    既然是在CF上AC的第一道交互题,而且正是这场比赛让我升紫了,所以十分值得纪念. 题目链接:CF原网 题目大意:交互题. 有一个长度为 $n$ 的序列 $a$,保证它从小到大排序后是个等差数列.你不知 ...

  4. Codeforces Round #371 (Div. 2) D. Searching Rectangles 交互题 二分

    D. Searching Rectangles 题目连接: http://codeforces.com/contest/714/problem/D Description Filya just lea ...

  5. Codeforces Round #499 (Div. 2) D. Rocket_交互题_二分

    第一次作交互题,有点不习惯. 由于序列是循环的,我们可以将一半的机会用于判断当前是否是在说谎,另一半的机会用于二分的判断. 对于判断是否实在说谎,用1判断即可.因为不可能有比1还小的数. 本题虽然非常 ...

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

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

  7. 交互题[CF1103B Game with modulo、CF1019B The hat、CF896B Ithea Plays With Chtholly]

    交互题就是程序与电脑代码的交互. 比如没有主函数的程序,而spj则给你一段主函,就变成了一个整体函数. 还有一种就是程序和spj之间有互动,这个用到fflush(stdout);这个函数就可以实现交互 ...

  8. CF1153E Serval and Snake(交互题)

    题目 CF1153E Serval and Snake 很有意思的一道交互题 做法 我们观察到,每次查询一行,当这一行仅包含一端是返回的答案是奇数 根据这个性质查询每一行每一列,我们大体能知道两端的位 ...

  9. Codeforces Round #551 (Div. 2) E. Serval and Snake (交互题)

    人生第一次交互题ac! 其实比较水 容易发现如果查询的矩阵里面包含一个端点,得到的值是奇数:否则是偶数. 所以只要花2*n次查询每一行和每一列,找出其中查询答案为奇数的行和列,就表示这一行有一个端点. ...

随机推荐

  1. 【摘录】UNITY优化-有关骨骼数量的上限问题

    1.顶点性能一般来说,如果您想在iPhone 3GS或更新的设备上每帧渲染不超过40,000可见点,那么对于一些配备 MBX GPU的旧设备(比如,原始的 iPhone,如 iPhone 3g和 iP ...

  2. ios常用空间UIScrollViewIndicator的一些属性

    UIScrollView属性: 1  alwaysBounceHorizontal         BOOL值,当水平滚条到达终点,总是(视图)弹跳 2  alwaysBounceVertical   ...

  3. go unit test-monkey

    package main import ( "fmt" "github.com/bouk/monkey" "os" "os/exe ...

  4. Excel VBA入门(六)过程和函数

    前面讲过,VBA代码有两种组织形式,一种就是过程(前面的示例中都在使用),另一种就是函数.其实过程和函数有很多相同之处,除了使用的关键字不同之外,还有不同的是: 函数有返回值,过程没有 函数可以在Ex ...

  5. c# winform 解决PictureBox 无法打印全部图片的问题

    一.   问题描述 在页面使用PictureBox 加载资料图片后,点击“打印”,只能打印图片首页,较大图片则无法全部打印. 二.   原因分析 PictureBox中打印图片时没有设置继续打印相关属 ...

  6. @property 修饰符

    原子性--- nonatomic 特质 在默认情况下,由编译器合成的方法会通过锁定机制确保其原子性(atomicity).如果属性具备 nonatomic 特质,则不使用同步锁.请注意,尽管没有名为“ ...

  7. XSS的原理分析与解剖:第三章(技巧篇)【转】

    0×01 前言: 关于前两节url: 第一章:http://www.freebuf.com/articles/web/40520.html 第二章:http://www.freebuf.com/art ...

  8. [C++] Realloc Memory

      函数说明 void* realloc (void* ptr, size_t size); 语法 指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小). 新的大小可大可小(但是要 ...

  9. java简单例子介绍IOC和AOP

    IOC和AOP的一些基本概念 介绍 IOC 一.什么是IOC IoC就是Inversion of Control,控制反转.在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内 ...

  10. vmware workstation 12 密钥

    VMware Workstation 12序列号:5A02H-AU243-TZJ49-GTC7K-3C61N