Subway Pursuit (二分)(交互题)
题目来源: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);
}
Subway Pursuit (二分)(交互题)的更多相关文章
- 【ECNU3542】神奇的魔术(二分交互题)
点此看题面 大致题意: 有一个\(1\sim 2^n\)的排列,\(n\le7\),每次交互告诉你有几个位置上的数是正确的,让你在\(1000\)轮以内猜出每个位置上的数. 二分 显然,我们可以通过二 ...
- Awkward Response AtCoder - 2656 ( 二分+交互题)
Problem Statement This is an interactive task. Snuke has a favorite positive integer, N. You can ask ...
- CF1114E Arithmetic Progression(交互题,二分,随机算法)
既然是在CF上AC的第一道交互题,而且正是这场比赛让我升紫了,所以十分值得纪念. 题目链接:CF原网 题目大意:交互题. 有一个长度为 $n$ 的序列 $a$,保证它从小到大排序后是个等差数列.你不知 ...
- Codeforces Round #371 (Div. 2) D. Searching Rectangles 交互题 二分
D. Searching Rectangles 题目连接: http://codeforces.com/contest/714/problem/D Description Filya just lea ...
- Codeforces Round #499 (Div. 2) D. Rocket_交互题_二分
第一次作交互题,有点不习惯. 由于序列是循环的,我们可以将一半的机会用于判断当前是否是在说谎,另一半的机会用于二分的判断. 对于判断是否实在说谎,用1判断即可.因为不可能有比1还小的数. 本题虽然非常 ...
- codeforces 1039B Subway Pursuit【二分+随机】
题目:戳这里 题意:一个点在[1,n]以内,我们可以进行4500次查询,每次查询之后,该点会向左或向右移动0~k步,请在4500次查询以内找到该点. 解题思路:一边二分,一边随机. 交互题似乎有好多是 ...
- 交互题[CF1103B Game with modulo、CF1019B The hat、CF896B Ithea Plays With Chtholly]
交互题就是程序与电脑代码的交互. 比如没有主函数的程序,而spj则给你一段主函,就变成了一个整体函数. 还有一种就是程序和spj之间有互动,这个用到fflush(stdout);这个函数就可以实现交互 ...
- CF1153E Serval and Snake(交互题)
题目 CF1153E Serval and Snake 很有意思的一道交互题 做法 我们观察到,每次查询一行,当这一行仅包含一端是返回的答案是奇数 根据这个性质查询每一行每一列,我们大体能知道两端的位 ...
- Codeforces Round #551 (Div. 2) E. Serval and Snake (交互题)
人生第一次交互题ac! 其实比较水 容易发现如果查询的矩阵里面包含一个端点,得到的值是奇数:否则是偶数. 所以只要花2*n次查询每一行和每一列,找出其中查询答案为奇数的行和列,就表示这一行有一个端点. ...
随机推荐
- UVALIVE 4556 The Next Permutation
4556 The Next PermutationFor this problem, you will write a program that takes a (possibly long) str ...
- Jquery.Ajax的使用方法
1.Get $('.manager_republish.notVIP').click(function () { $.ajax({ async: false, type: "get" ...
- Spring <context:annotation-config />讲解
在基于主机方式配置Spring的配置文件中,你可能会见到<context:annotation-config />这样一条配置,他的作用是向Spring容器注册AutowiredAnnot ...
- Sqlserver2005中的varchar,varchar,char,nchar的比较
C#窗体中的TextBox 的MaxLength:与Nvarchar类似,不论是什么,最多只能为2.我我11我1
- Scala操作MongoDB
Scala操作MongoDB // Maven <dependencies> <dependency> <groupId>org.mongodb</group ...
- 全文搜索技术—Solr
1. 学习计划 1. Solr的安装及配置 a) Solr整合tomcat b) Solr后台管理功能介绍 c) 配置中文分析器 2. 使用Solr的后台管理索引库 a) ...
- js动态的给json对象添加新的元素
把{name:"xxx",age:"xxx"}变成{name:"xxx",age:"xxx",value:"x ...
- Spring Boot☞ 配置文件详解:自定义属性、随机数、多环境配置等
自定义属性与加载 我们在使用Spring Boot的时候,通常也需要定义一些自己使用的属性,我们可以如下方式直接定义: application-dev.yml com.didispace.blog: ...
- 实践作业4---DAY5阶段四。
阶段四:分析 这一阶段工作就是分析博客园与csdn优点缺点: 根据邹欣老师在<现代软件工程>一书中的描述: 程序 = 算法 + 数据结构: 软件 = 程序 + 软件工程(软件服务还有数据, ...
- bootstrap小图标引用方法
<span class="glyphicon glyphicon-search"></span> <span class="glyphico ...