CF1479A.Searching Local Minimum

普及+/提高

通过率:0%

时间限制:2.00s

内存限制:512MB

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

This is an interactive problem.

Homer likes arrays a lot and he wants to play a game with you.

Homer has hidden from you a permutation a1,a2,…,ana_1, a_2, \dots, a_n of integers 11 to nn. You are asked to find any index kk (1≤k≤n1 \leq k \leq n) which is a local minimum.

For an array a1,a2,…,ana_1, a_2, \dots, a_n, an index ii (1≤i≤n1 \leq i \leq n) is said to be a local minimum if ai<min⁡ai−1,ai+1a_i \lt \min{a_{i-1},a_{i+1}}, where a0=an+1=+∞a_0 = a_{n+1} = +\infty. An array is said to be a permutation of integers 11 to nn, if it contains all integers from 11 to nn exactly once.

Initially, you are only given the value of nn without any other information about this permutation.

At each interactive step, you are allowed to choose any ii (1≤i≤n1 \leq i \leq n) and make a query with it. As a response, you will be given the value of aia_i.

You are asked to find any index kk which is a local minimum after at most 100100 queries.

Interaction

You begin the interaction by reading an integer nn (1≤n≤1051\le n \le 10^5) on a separate line.

To make a query on index ii (1≤i≤n1 \leq i \leq n), you should output "? ii" in a separate line. Then read the value of aia_i in a separate line. The number of the "?" queries is limited within 100100.

When you find an index kk (1≤k≤n1 \leq k \leq n) which is a local minimum, output "! kk" in a separate line and terminate your program.

In case your query format is invalid, or you have made more than 100100 "?" queries, you will receive Wrong Answer verdict.

After printing a query do not forget to output end of line and flush the output. Otherwise, you will get Idleness limit exceeded. To do this, use:

  • fflush(stdout) or cout.flush() in C++;
  • System.out.flush() in Java;
  • flush(output) in Pascal;
  • stdout.flush() in Python;
  • see documentation for other languages.

Hack Format

The first line of the hack should contain a single integer nn (1≤n≤1051 \leq n \leq 10^5).

The second line should contain nn distinct integers a1,a2,…,ana_1, a_2, \dots, a_n (1≤ai≤n1 \leq a_i \leq n).

这是一个交互式问题。

霍默非常喜欢数组,他想和你玩一个游戏。

霍默向你隐藏了一个由整数 11 到 nn 构成的排列 a1,a2,…,ana_1, a_2, \dots, a_n。你需要找出任意一个下标 kk(1≤k≤n1 \leq k \leq n),使得该下标对应的位置是一个局部最小值。

对于数组 a1,a2,…,ana_1, a_2, \dots, a_n,若下标 ii(1≤i≤n1 \leq i \leq n)满足 ai<min⁡{ai−1,ai+1}a_i \lt \min\{a_{i-1},a_{i+1}\},则称其为一个局部最小值,其中定义 a0=an+1=+∞a_0 = a_{n+1} = +\infty。若一个数组恰好包含 11 到 nn 的每个整数各一次,则称其为整数 11 到 nn 的一个排列。

初始时,你仅被给出 nn 的值,关于该排列的其他任何信息均不可知。

在每次交互步骤中,你可以任选一个下标 ii(1≤i≤n1 \leq i \leq n)并发起一次查询;作为回应,你将获得 aia_i 的值。

你需在至多 100100 次查询内,找出任意一个满足条件的局部最小值下标 kk。

交互方式

首先,你在单独一行读入一个整数 nn(1≤n≤1051\le n \le 10^5)。

要对下标 ii(1≤i≤n1 \leq i \leq n)发起查询,请在单独一行输出 ? $i$,然后在单独一行读入 aia_i 的值。? 类查询的总数不得超过 100100 次。

当你找到一个下标 kk(1≤k≤n1 \leq k \leq n)使得其为局部最小值时,请在单独一行输出 ! $k$ 并终止程序。

若你的查询格式非法,或 ? 类查询次数超过 100100 次,你将收到“Wrong Answer”判据。

每次输出查询后,请务必输出换行符并刷新输出缓冲区,否则你会收到 “Idleness limit exceeded”。为此,请使用:

  • C++ 中:fflush(stdout) 或 cout.flush();
  • Java 中:System.out.flush();
  • Pascal 中:flush(output);
  • Python 中:stdout.flush();
  • 其他语言请查阅相应文档。

Hack 格式

Hack 输入的第一行应包含一个整数 nn(1≤n≤1051 \leq n \leq 10^5)。

第二行应包含 nn 个互不相同的整数 a1,a2,…,ana_1, a_2, \dots, a_n(1≤ai≤n1 \leq a_i \leq n)。

输入输出样例

  • 输入#1

    5
    3
    2
    1
    4
    5

    输出#1

    ? 1
    ? 2
    ? 3
    ? 4
    ? 5
    ! 3

说明/提示

In the example, the first line contains an integer 55 indicating that the length of the array is n=5n = 5.

The example makes five "?" queries, after which we conclude that the array is a=[3,2,1,4,5]a = [3,2,1,4,5] and k=3k = 3 is local minimum.

在示例中,第一行包含一个整数 55,表示数组长度为 n=5n = 5。

该示例进行了五次 "?" 查询,之后我们得出结论:数组为 a=[3,2,1,4,5]a = [3,2,1,4,5],且 k=3k = 3 是一个局部最小值。

输入解题思路,AI测评打分。不知道怎么写?

首页