QOJ.ac

QOJ

Time Limit: 10 s Memory Limit: 512 MB Total points: 100 Interactive

#13468. lancllords

Statistics

这是一道交互题

相信你们已经几个月没有见过 CZL 了吧,他又回来了!我们成功地把小 U、小 Z、CZL 这三个人放在了一套题目里面。

CZL 有一副打乱的牌,这副牌从上到下有 $n$ 张牌(牌的位置从 $0$ 开始编号),其中大小为 $0,1,2,\dots,n-1$ 中的一个,且不同牌的大小互不相同。现在,你要问出这副牌里面每一张的大小,但是大魔术师怎么能够直接告诉你呢?

一开始,CZL 的左手和右手都停留在第 $0$ 张牌的位置。每次你可以指定让它的左手向上移动一张牌,或者向下移动一张牌。你也可以让他的右手向上移动一张牌,或者向下移动一张牌。你还可以向它询问左手的牌是否比右手的牌要小。通过这些操作,你需要得到这副牌里面从上到下每一张牌的大小。

虽然 CZL 的手很灵活,但是他还要给别的人表演魔术。所以,请你在不超过 $7.0 \cdot 10^8$ 次移动内,得到这副牌从上到下每一张牌的大小。

你的代码必须包含一个头文件 "lancllords.h",你需要实现一个函数:

vector<int> answer(int n);

这个函数中正整数 $n$ 表示牌的个数。这个函数需要返回一个长度为 $n$ 的数组 $P$,其中 P[i] 表示从上到下第 $i$ 张牌的大小。

我们假设 CZL 的左手在第 $p$ 张牌的位置,右手在第 $q$ 张牌的位置。你可以调用如下函数:

void inc_p();

表示将 CZL 的左手向下移动一张牌的位置。

void dec_p();

表示将 CZL 的左手向上移动一张牌的位置。

void inc_q();

表示将 CZL 的右手向下移动一张牌的位置。

void dec_q();

表示将 CZL 的右手向上移动一张牌的位置。

bool cmp();

表示比较第 $p$ 张牌的大小和第 $q$ 张牌的大小。若第 $p$ 张牌比第 $q$ 张牌小,则返回 true,否则返回 false

你每调用了前 $4$ 个函数,grader 的变量 $cnt$ 将增加 $1$。最终评测时,如果 $cnt$ 的值过大,该测试点算作不通过。你需要时刻保证 $0≤p,q< n$,否则该测试点也算作不通过。

注意交互库在前四个函数调用次数不超过 $7.0\cdot 10^8$,第五个函数调用次数不超过 $10^7$ 的情况下,用时不超过五秒,也就是说你的代码有至少五秒的时间。

我们下发了 grader.cpplancllords_sample.cpp 这两个文件,其中 lancllords_sample.cpp 是一个选手代码的示例。你可以通过命令 g++ lancllords.cpp grader.cpp -o lancllords -O2 来测试你的程序。

输入格式

第一行读入一个正整数 $n$,表示牌的个数。

接下来一行 $n$ 个数 $P_0,\dots,P_{n-1}$,表示从上往下第 $i$ 张牌的大小。

输出格式

由交互库输出信息。在选手本地测试时,如果你中间 $p,q$ 的值越界了,那么会输出 "Out of bound!"。如果你返回的答案错误,会输出 "Wrong answer!",否则输出一行为 "Right Output!",另一行表示你调用前四个函数的次数。

我们下发文件中的交互库与最终交互库是不同的!但是最终的测试方式里面,排列仍然是预先生成好的,不会因你的询问而改变!

样例数据

样例 1 输入

5
3 4 0 1 2

样例 1 输出

Right Output!
You use 100 operations!

样例 1 解释

这个样例表示你调用了 $100$ 次前四个函数,最终得到了正确的排列。

样例 2

见下发文件。

样例 3

见下发文件。

子任务

对于所有数据 $1 \le n \le 150000$。

Subtask $1$($6$ pts): $n \le 1000$

Subtask $2$($7$ pts): $n \le 10000$

Subtask $3$($38$ pts): $n \le 30000$

Subtask $4$($25$ pts): $n \le 50000$

Subtask $5$($24$ pts): $n \le 150000$

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.