logo AlgoBeat OnlineJudge 返回比赛
登录 注册

E. [Sleeping Cup #11] E. Topology-Aware Step-By-Step Sorting

内存限制:512 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:Special Judge

题目描述

本题的交互库不是自适应的,排列 在交互开始前已经预先确定,不会在交互过程中动态改变。

本题的原始数据没有针对任何随机数生成器或随机数种子进行特定构造。

交互库有一个 的排列 并拒绝让你直接访问。

你被允许做如下操作,次数不限:

  • 向交互库支付 个金币,交换 中你所指定的两项,其中:
    • 是操作前 中逆序对的数量。
    • 是操作后 中逆序对的数量。
  • 操作结束后,交互库会给你结账,告知你 的值。

你的手里有 个金币,请在不欠债的前提下将 重排成升序

本题是交互题。

本题提供额外头文件 "sorting.h",你需要使用它进行交互:

函数 描述 限制 可调用次数
int operate(int l, int r); 交换排列的第 项和第 项并得到 的值 不限
void confirm(); 当你认为完成了排序时,告知交互库排序完成 你必须在告知后终止程序

请在以下模板上答题。

#include <bits/stdc++.h>
#include "sorting.h"
using namespace std;
int main()
{
	int n = 1000, q = 5e4;
	bool ok = false;
	while (!ok)
	{
		int l = 1, r = n;
		// ...
		int c = operate(l, r);
		q -= c;
		assert(q >= 0);
		// ...
	}
	confirm();
	return 0;
}

样例

样例 1

测试点 1 和下发的 1.in 使用与本样例相同的秘密排列进行评测。

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

调用函数 返回值 解释
operate(1, 2); 这表明
把它换回去
operate(2, 3); 这表明
把它换回去
(此处省略 次类似的函数调用)
operate(999, 1000); 这表明
把它换回去
(由上可知,原来的排列就是
confirm(); 一共支付了 枚金币,答案正确

样例 2

测试点 2 和下发的 2.in 使用与本样例相同的秘密排列进行评测。

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

调用函数 返回值 解释
operate(1, 2); 这表明
把它换回去
operate(2, 3); 这表明
把它换回去
(此处省略 次类似的函数调用)
operate(999, 1000); 这表明
把它换回去
(由上可知,原来的排列就是
operate(1, 1000); 归位
operate(2, 999); 归位
(此处省略 次类似的函数调用)
operate(500, 501); 归位
confirm(); 一共支付了 枚金币,答案正确

数据范围与提示

下发文件

我们下发了示例头文件 sorting.h 和两个样例(1.in2.in),该头文件和实际评测时使用的头文件实现基本一致,但实际评测时使用的头文件添加了用于抵御非法攻击的特殊模块。

请将你的程序 sorting.cpp 和头文件 sorting.h 放在同一目录下后,使用以下命令编译得到可执行文件(<Additional Parameters...> 是你自己指定的额外编译参数,Windows 下得到 sorting.exe,Linux 下得到 sorting):

g++ sorting.cpp -o sorting <Additional Parameters...>

然后把样例 1 1.in 放在同一目录下,使用以下命令让程序从标准输入 stdin 读入并测试样例:

  • sorting < 1.in(Windows)
  • ./sorting < 1.in(Linux)

样例 2 2.in 的测试方式同理。

程序将向标准输出 stdout 打印评测结果,保证打印的信息与评测时返回的信息一致。

你也可以自己将一行 个空格隔开的正整数(必须是一个 的排列)写入文件,把它放在同一目录下,使用和上面类似的方式测试。

请注意,头文件不会校验输入的合法性。