#P94. Interactive Problem Test 3: A Tough Binary Search

Interactive Problem Test 3: A Tough Binary Search

负责人

题目描述

现有一份二分查找代码(这份代码将在评测程序中实现,因此你无法查看其内容)。请编写一个自适应性的交互库,使得该代码的实际查找次数总是不小于理论上确保查找成功所需的最小查找次数。

交互方式

本题为交互题。

请使用以下模板:

#include <bits/stdc++.h>
using namespace std;
int respond(int n, int q, int x, vector<pair<int, int> > p)
{
	int z = 0;
	// ...
	return z;
}
  • nn:本次二分查找的上界。要查找的内容是一个不大于 nn 的正整数 yy
  • qq:本轮二分查找中已经完成的查找次数(不包括本次查找)。
  • xx:代表本次查找的基准值。你需要根据 yyxx 的大小关系确定返回值 zz
    • 如果 y>xy>x,返回 z=0z=0
    • 如果 y=xy=x,返回 z=1z=1
    • 如果 y<xy<x,返回 z=2z=2
    • 在不与任何先前的查找信息相矛盾的前提下,你可以动态修改 yy 的值。
  • pp:一个长度为 qq 的数组(下标从 11 开始),表示本轮二分查找中先前的查找信息。它包含 qq 个二元组 (u,v)(u,v)
    • uu 表示评测程序在该次二分查找中传入的 xx 值。
    • vv 表示你的程序在该次二分查找中返回的 zz 值。
    • 保证数组中的查找信息是按照时间顺序从前往后排列的,没有经过打乱。
  • 保证 1x,un1041 \le x,u \le n \le 10^41q351 \le q \le 35v{0,2}v \in \{0,2\}
  • 保证该函数被调用的次数不超过 10610^6 次。
  • 保证所进行的二分查找轮数不超过 4×1044 \times 10^4 轮。

样例

下面的样例中一共进行了 33 轮二分查找。

以下的交互过程可以获得 AC。

调用函数 返回值 解释
respond(4, 0, 1, []); 00 第一轮二分查找开始。你的程序将 yy 拟定为 22
respond(4, 1, 2, [(1, 0)]); 0 0 你的程序将 yy 改为 33
respond(4, 2, 4, [(1, 0), (2, 0)]); 22 你的程序仍然将 yy 设定为 33
respond(4, 3, 3, [(1, 0), (2, 0), (4, 2)]); 11 第一轮二分查找结束。评测程序一共进行了 44 次查找。
respond(1, 0, 1, []); 1 1 第二轮二分查找中,评测程序只进行了 11 次查找。
respond(5, 0, 3, []); 22 第三轮二分查找开始。你的程序将 yy 拟定为 22
respond(5, 1, 2, [(3, 2)]); 2 2 你的程序将 yy 改为 11
respond(5, 2, 1, [(3, 2), (2, 2)]); 11 第三轮二分查找结束。评测程序一共进行了 33 次查找。