U276219 Yet another permutation problem
题目描述
曾经有过这样一个问题:给定一个长度为 $n$ 的正整数序列 $a_1,a_2\dots a_n$,要求将这个序列重排成序列 $a'$,使得相邻项都不相同,也就是 $\forall i\in [1,n-1],a'_i\neq a'_{i+1}$。
这个问题实在太简单了,于是你想试试不知道这个序列的时候能否解决这个问题。
你可以进行如下提问:向交互库输入 $(x,y)(x\neq y)$,交互库会返回 $a_x\neq a_y$ 是否成立。如果成立返回 $1$,否则返回 $0$。
提问结束后你需要回答出一种重排的方案,或报告无解。
### 交互格式
你不需要定义主函数,你只需要定义一个函数:
```cpp
extern "C" vectorsolve(int n,int lim)
```
其中 $n$ 表示序列长度,$lim$ 表示最多问询次数,返回的 `vector` 表示答案。如果有解返回一个长度为 $n$ 的排列,否则返回一个空的 `vector`。
在这个函数中你可以调用 `query(x,y)`,表示问询 $a_x\neq a_y$ 是否成立。
以下是样例程序:
```cpp
#include
using namespace std;
extern "C" bool query(int x,int y);
extern "C" vectorsolve(int n,int lim){
vectorans;
return ans;
}
```
如果对交互过程有疑问,请看提示中的样例。
输入格式
见交互格式。
输出格式
见交互格式。
说明/提示
举例:原序列 $a=[1,1,2]$。
调用 `query(1,2)`,相同,返回 $0$。
调用 `query(1,3)`,不同,返回 $1$。
调用 `query(2,3)`,相同,返回 $1$。
返回答案 `1 3 2`,符合要求。
你可以通过下发文件中的 `grader.cpp` 检测自己程序的正确性。
对于所有数据,都有 $T=200,2\le n\le 1000$。
数据范围如下表:
| 测试点编号 |$n$ | $lim$ | 特殊性质 |
| :-----------: | :-----------: | :-----------: | :-----------: |
| $1,2,3$ |$\le 9$ | $=\frac{n(n-1)}{2}$ | 无 |
| $4,5,6$ |$\le 100$ | $=\frac{n(n-1)}{2}$ | 无 |
| $7,8$ |$\le 1000$ | $=2n$ | 保证 $a_i\le 2$ |
| $9,10$ |$\le 1000$ | $=2n$ | 保证 $a_i\le 3$ |
| $11,12,13,14$ |$\le 1000$ | $=3n$ | 无 |
| $15,16,17$ |$\le 1000$ | $=2n$ | 无 |
| $18,19,20$ |$\le 1000$ | $=\lceil 1.5n \rceil$ | 无 |