CF1973D.Cat, Fox and Maximum Array Split

提高+/省选-

通过率:0%

AC君温馨提醒

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

题目描述

这是一个交互题。

Fox 给了 Cat 两个正整数 nn 和 kk。她有一个长度为 nn 的隐藏数组 a1,…,ana_1, \ldots, a_n,其中每个 aia_i 满足 1≤ai≤n1 \leq a_i \leq n。现在他们要玩如下的游戏:

对于任意两个整数 l,rl, r,满足 1≤l≤r≤n1 \leq l \leq r \leq n,定义 f(l,r)=(r−l+1)⋅max⁡x=lraxf(l, r) = (r - l + 1) \cdot \max\limits_{x=l}^r a_x。也就是说,f(l,r)f(l, r) 等于子数组 al,…,ara_l, \ldots, a_r 的最大值乘以其长度。

Cat 最多可以向 Fox 询问 2n2n 个关于数组的问题。他每次会告诉她两个整数 ll 和 xx(1≤l≤n,1≤x≤1091 \leq l \leq n, 1 \leq x \leq 10^9),她会告诉他一个整数 pp 作为答案——即最小的正整数 rr,使得 f(l,r)=xf(l, r) = x,如果不存在这样的 rr,则返回 n+1n+1。

现在,Cat 需要找到最大的值 mm,使得存在一个序列 c1,…,ck−1c_1, \ldots, c_{k-1},满足 1≤c1<…<ck−1<n1 \leq c_1 < \ldots < c_{k-1} < n,并且 f(1,c1)=f(c1+1,c2)=…=f(ck−1+1,n)=mf(1, c_1) = f(c_1 + 1, c_2) = \ldots = f(c_{k-1}+1, n) = m。如果不存在这样的 mm,他应当输出 −1-1 作为答案。注意,当 k=1k = 1 时,mm 总是等于 f(1,n)f(1, n)。

换句话说,目标是找到最大的 mm,使得你可以将数组恰好划分为 kk 个子数组(kk 是交互开始时给定的常数),并且所有子数组的长度与其最大值的乘积都等于 mm,或者判断不存在这样的 mm。每个元素必须且只能属于一个子数组。

Cat 不知道该怎么做,所以他请你帮他玩这个游戏。

输入格式

每个测试点包含多组测试数据。第一行包含一个整数 tt(1≤t≤1031 \leq t \leq 10^3),表示测试数据组数。每组测试数据描述如下。

每组测试数据的第一行包含两个正整数 nn 和 kk(1≤k≤n≤1041 \leq k \leq n \leq 10^4),分别表示隐藏数组的长度和希望划分的子数组数。

现在你可以进行如下查询——输出一行形如“? l x\mathtt{?}\ l\ x”(需满足 1≤l≤n1 \leq l \leq n,1≤x≤1091 \leq x \leq 10^9),你将收到最小的整数 rr,满足 l≤r≤nl \leq r \leq n 且 f(l,r)=xf(l, r) = x,若不存在这样的 rr,则返回 n+1n+1。

如果你想输出答案,输出一行“! m\mathtt{!}\ m”,你将收到 11 表示答案正确,−1-1 表示答案错误。在第一种情况下,交互继续到下一个测试点。注意,输出答案不计入查询次数。请注意,在你输出答案后,不会立即收到下一组测试数据的输入,你需要先读取你上一个答案是否正确。

如果你在任何时候收到 −1-1,说明你的程序进行了非法查询、超出了查询次数限制,或者给出了错误答案。你的程序必须立即终止,否则会收到错误答案(Wrong Answer)判定。否则,你的程序会继续读取已关闭的输入流,可能得到任意判定。

每次输出查询后,不要忘记输出换行并刷新输出缓冲区,否则会收到“Idleness limit exceeded”判定。具体做法如下:

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

保证所有测试点中 nn 的总和不超过 10410^4。

Hack 数据

Hack 数据格式如下:第一行包含一个整数 tt(1≤t≤1031 \leq t \leq 10^3),表示测试数据组数。每组测试数据描述如下。

每组测试数据的第一行包含两个整数 nn 和 kk(1≤k≤n≤1041 \leq k \leq n \leq 10^4),分别表示数组 aa 的长度和希望划分的子数组数。

第二行包含 nn 个整数 a1,a2,…,ana_1, a_2, \ldots, a_n(1≤ai≤n1 \leq a_i \leq n)。

所有测试点中 nn 的总和不超过 10410^4。

输出格式

见输入格式描述。

输入输出样例

  • 输入#1

    3
    1 1
    
    1
    2 2
    
    1
    
    3
    
    1
    6 3
    
    7
    
    2
    
    3
    
    6
    
    1

    输出#1

    ! 1
    
    
    ? 1 1
    
    ? 2 1
    
    ! -1
    
    
    ? 1 9
    
    ? 1 6
    
    ? 3 6
    
    ? 4 6
    
    ! 6

说明/提示

三组测试数据中的隐藏数组分别为 [1][1]、[1,2][1, 2] 和 [1,3,6,1,2,1][1, 3, 6, 1, 2, 1]。在第二组测试数据中,没有任何划分满足条件,因此答案为 −1-1。

第三组测试数据的第一次查询答案为 77,因为不存在满足条件的 rr。第二次查询中,由于 2⋅max⁡(1,3)=62 \cdot \max(1, 3) = 6,所以答案为 22,因为 r=1r = 1 不满足条件。

样例交互中三组答案(1,−1,61, -1, 6)均猜对,因此每次都收到了 11。

由 ChatGPT 4.1 翻译

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

首页