CF 810 D. Glad to see you!

时间:2022-04-01 14:48:12

codeforces 810 D. Glad to see you!

http://codeforces.com/contest/810/problem/D

题意

大小为k的集合,元素的范围都在[1,n],每次可以询问(x,y),如果min|x-a|<=min|y-b| a,b∈S,交互库返回”TAK",否则返回“NIE”。

分析

怎么确保能找到答案。我们可以将(1~n)分成两份(1~mid)(mid+1~r),显然要猜的数肯定是在这两个区间内。 
然后怎么判断我们可以找mid和mid+1两个数来判断,如果|mid-a|<=|mid+1-b|,那么显然要猜的数肯定是mid或者mid的左侧。如果|mid-a|>|mid+1-b|很显然要猜的数肯定是mid+1或者mid+1的右侧然后就是二分,根据题目的回答进行二分

代码

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
using namespace std;
typedef long long LL; int n,k;
char s[]; bool Ask(int x,int y) {
if (y > n) return true;
printf("1 %d %d\n",x,y); fflush(stdout);
scanf("%s",s);
return s[] == 'T';
}
int check(int L,int R) {
if (L > R) return ;
int ans = ;
while (L <= R) {
int mid = (L + R) >> ;
if (Ask(mid, mid + )) ans = mid, R = mid - ;
else L = mid + ;
}
return ans;
}
int main() {
cin >> n >> k;
int A = check(, n), B;
B = check(, A - );
if (!B) B = check(A + , n);
printf("2 %d %d", A, B); fflush(stdout);
return ;
}