CF1973D.Cat, Fox and Maximum Array Split
提高+/省选-
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
这是一个交互题。
Fox 给了 Cat 两个正整数 n 和 k。她有一个长度为 n 的隐藏数组 a1,…,an,其中每个 ai 满足 1≤ai≤n。现在他们要玩如下的游戏:
对于任意两个整数 l,r,满足 1≤l≤r≤n,定义 f(l,r)=(r−l+1)⋅x=lmaxrax。也就是说,f(l,r) 等于子数组 al,…,ar 的最大值乘以其长度。
Cat 最多可以向 Fox 询问 2n 个关于数组的问题。他每次会告诉她两个整数 l 和 x(1≤l≤n,1≤x≤109),她会告诉他一个整数 p 作为答案——即最小的正整数 r,使得 f(l,r)=x,如果不存在这样的 r,则返回 n+1。
现在,Cat 需要找到最大的值 m,使得存在一个序列 c1,…,ck−1,满足 1≤c1<…<ck−1<n,并且 f(1,c1)=f(c1+1,c2)=…=f(ck−1+1,n)=m。如果不存在这样的 m,他应当输出 −1 作为答案。注意,当 k=1 时,m 总是等于 f(1,n)。
换句话说,目标是找到最大的 m,使得你可以将数组恰好划分为 k 个子数组(k 是交互开始时给定的常数),并且所有子数组的长度与其最大值的乘积都等于 m,或者判断不存在这样的 m。每个元素必须且只能属于一个子数组。
Cat 不知道该怎么做,所以他请你帮他玩这个游戏。
输入格式
每个测试点包含多组测试数据。第一行包含一个整数 t(1≤t≤103),表示测试数据组数。每组测试数据描述如下。
每组测试数据的第一行包含两个正整数 n 和 k(1≤k≤n≤104),分别表示隐藏数组的长度和希望划分的子数组数。
现在你可以进行如下查询——输出一行形如“? l x”(需满足 1≤l≤n,1≤x≤109),你将收到最小的整数 r,满足 l≤r≤n 且 f(l,r)=x,若不存在这样的 r,则返回 n+1。
如果你想输出答案,输出一行“! m”,你将收到 1 表示答案正确,−1 表示答案错误。在第一种情况下,交互继续到下一个测试点。注意,输出答案不计入查询次数。请注意,在你输出答案后,不会立即收到下一组测试数据的输入,你需要先读取你上一个答案是否正确。
如果你在任何时候收到 −1,说明你的程序进行了非法查询、超出了查询次数限制,或者给出了错误答案。你的程序必须立即终止,否则会收到错误答案(Wrong Answer)判定。否则,你的程序会继续读取已关闭的输入流,可能得到任意判定。
每次输出查询后,不要忘记输出换行并刷新输出缓冲区,否则会收到“Idleness limit exceeded”判定。具体做法如下:
- C++:fflush(stdout) 或 cout.flush()
- Java:System.out.flush()
- Pascal:flush(output)
- Python:stdout.flush()
- 其它语言请查阅相关文档。
保证所有测试点中 n 的总和不超过 104。
Hack 数据
Hack 数据格式如下:第一行包含一个整数 t(1≤t≤103),表示测试数据组数。每组测试数据描述如下。
每组测试数据的第一行包含两个整数 n 和 k(1≤k≤n≤104),分别表示数组 a 的长度和希望划分的子数组数。
第二行包含 n 个整数 a1,a2,…,an(1≤ai≤n)。
所有测试点中 n 的总和不超过 104。
输出格式
见输入格式描述。
输入输出样例
输入#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,2] 和 [1,3,6,1,2,1]。在第二组测试数据中,没有任何划分满足条件,因此答案为 −1。
第三组测试数据的第一次查询答案为 7,因为不存在满足条件的 r。第二次查询中,由于 2⋅max(1,3)=6,所以答案为 2,因为 r=1 不满足条件。
样例交互中三组答案(1,−1,6)均猜对,因此每次都收到了 1。
由 ChatGPT 4.1 翻译
输入解题思路,AI测评打分。不知道怎么写?