题目背景
译自 COCI 2024/2025 #3 T5。1s,0.5G。满分为 120。
为了方便测试,公开交互库。
题目描述
这是一道交互题。
有一个初始时为空的数组 a。
n 次操作,第 i 次操作向 a 的末尾添加 xi 个整数。
每次操作后,通过若干次询问,你需要找到最小的未被标记的整数对应的下标 x,并给 ax 打标记。
每次询问,你可以询问两个未被标记的整数 ai,aj 的大小关系。
设当前数组长度为 l,保证 ∀1≤i<j≤l,ai<aj 和 aj<ai 恰有一个成立。换句话说,保证数组内元素两两不同。
实现细节
首先读入一个正整数 n。接下来依次处理 n 次操作。
对于第 i 次操作,读入一个正整数 xi,表示增加的整数数量。
接下来你可以按照以下格式询问若干次:
- ? i j:询问 ai,aj 的大小关系。
- 返回 0,表示 ai<aj;返回 1,表示 ai>aj。
- 令当前数组长度为 l,你需要保证 1≤i,j≤l。
- 你需要保证 i=j,且 ai,aj 未被标记。
按以下格式回答:
- ! x:当前数组内未被标记的最小整数为 ax。
回答后立刻读入下一个整数 xi+1,若这是最后一次操作则立刻结束程序。
在每次询问或者回答后,都要换行并刷新缓冲区。 刷新缓冲区的方式:C++ 中的 std::cout.flush()
,std::cout<<std::endl
。
输入格式
见【实现细节】。
输出格式
见【实现细节】。
提示
样例解释
样例 1 中,a=[3,2,4,1,5]。
- 查询 a1 与 a2:a1>a2,返回 1;
- 查询 a1 与 a3:a1<a3,返回 0;
- 查询 a2 与 a3:a2<a3,返回 0。
不难发现 a2 为当前未标记的最小值,所以回答 2。接下来继续处理剩余的两次操作。
数据范围
对于 100% 的数据,保证:
- 1≤n≤40;
- 1≤xi,∑xi≤2000。
- 数组内整数两两不同。
计分方式
令你的程序询问次数的最大值为 q。
- q≤2700,得 120 分。
- 2700<q≤7000,得 75 分。
- 7000<q≤2×104,得 35 分。
- 2×104<q≤8×104,得 15 分。
- 8×104<q,得 0 分。