#3237. 特殊排序(Innovative Business)没有数据 提高+/省选−

时间限制:1000 ms 内存限制:512 MiB 标准输入输出
题目类型:传统 评测方式:无测试数据
上传者: root

题目描述

个元素,编号 ,每一对元素之间的大小关系是确定的,关系具有反对称性,但不具有传递性。

注意:不存在两个元素大小相等的情况。

也就是说,元素的大小关系是 个点与 条有向边构成的任意有向图。

然而,这是一道交互式试题,这些关系不能一次性得知,你必须通过不超过 次提问来获取信息,每次提问只能了解某两个元素之间的关系。

现在请你把这 个元素排成一行,使得每个元素都小于右边与它相邻的元素。

你可以通过我们预设的 bool 函数 compare 来获得两个元素之间的大小关系。

例如,编号为 的两个元素,如果元素 小于元素 ,则 compare(a,b) 返回 true,否则返回 false。

个元素排好序后,把他们的编号以数组的形式输出,如果答案不唯一,则输出任意一个均可。


为了适配 OJ,本题交互格式进行修改。改为 I/O 交互。

bool compare(int a, int b)
{
    cout << "? " << a << ' ' << b << endl;
    bool t;
    cin >> t;
    return t;
}

请在代码里填写此函数。擅自修改内容后果自负。

输入格式

交互库会先给出一个正整数 表示元素数量。

之后的每次回答,交互库会返回 表示大小关系。 代表 代表

输出格式

你可以使用题面中的 compare 函数进行提问。如要自己编写询问,询问格式为 ? a b

输出答案之前请先给出一个感叹号 !。之后用空格分割这 个编号。具体见样例 #1.

样例

样例输入 1

3

1

0

0

样例输出 1

? 1 2

? 1 3

? 2 3

! 3 1 2

数据范围与提示

测试数据满足