【二分+交互】codeforces B. Glad to see you!
2024-08-23 22:16:51
codeforces.com/contest/809/problem/B
只需要找到2个被选中的,首先,注意到将区间二等分时左侧区间为[l,mid],右侧区间为[mid+1,r],dui(mid,mid+1)进行询问,就可以得到这两个区间中哪个最近的离边界最近(如果不存在,距离可理解为无穷远),这样就确保了某一个区间必定存在至少一个被选中的,重复此过程,就一定能找到一个被选中的,设该位置为x。k>=2 所以此位置左侧、右侧中至少有一个有。先对左侧重复该过程,对结果进行和x的询问。因为如果那个位置是被选定的,则结果一定为0<=0,如果符合,直接输出,不然一定在右侧区域,对右侧区域重复该过程即可。
【Accepted】
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <bitset>
#include <ctime>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=1e5+;
int n,k;
bool query(int x,int y)
{
if(x<=||y>n)
return false;
string res;
cout<<"1 "<<x<<" "<<y<<endl;
cin>>res;
return res=="TAK";
}
int get(int l,int r)
{
if(l>r)
{
return -;
}
while(l<r)
{
int mid=(l+r)>>;
if(query(mid,mid+))
{
r=mid;
}
else
{
l=mid+;
}
}
return l;
}
int main()
{ cin>>n>>k;
int x,y;
x=get(,n);
y=get(,x-);
if(!query(y,x))
{
y=get(x+,n);
}
cout<<"2 "<<x<<" "<<y<<endl;
return ;
}
注意:
get函数和query函数没有if判断,就会出错,比如x为1
而且在左侧找到了y之后要判断是否符合。
不要用while(~scanf()),只读单组;print之后fflush(stdout)否则IDLENESS LIMIT EXCEEDED
最新文章
- Redis常用命令(String数据类型)
- ASP.NET Core 优雅的在开发环境保存机密(User Secrets)
- iOS开发----优秀文章推荐
- Codeforces Round #189 (Div. 2) A. Magic Numbers
- EnableViewState=“false”不能乱用啊
- java--常用类summary(三)
- Oracle--存储过程学习进阶
- 《摇滚南京》——";人生下来就是孤独";
- android ListView中的Item有Button时候点击异常处理
- 延迟加载(Lazy Load)
- JAVA面试题:69道Spring面试题和答案
- gitlab使用入门
- swift label不同颜色、不同字体
- Spark源码剖析(八):stage划分原理与源码剖析
- express入门
- HDU-1260.Tickets(简单线性DP)
- Java Web开发中的乱码问题
- python实现图的遍历(递归和非递归)
- VC++中多字节字符集和Unicode之间的互换
- 压缩打包介绍/gzip压缩工具/bzip2压缩工具/xz压缩工具