#1268. Innovative Business

Innovative Business

题目描述

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

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

也就是说,元素的大小关系是 NN 个点与 N×(N1)2\frac{N \times (N-1)}{2} 条有向边构成的任意有向图。

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

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

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

例如,编号为 aabb 的两个元素,如果元素 aa 小于元素 bb,则 compare(a,b) 返回 true\text{true},否则返回 false\text{false}

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


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

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

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

输入格式

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

之后的每次回答,交互库会返回 1100 表示大小关系。11 代表 true\text{true}00 代表 false\text{false}

输出格式

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

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

3

1

0

0
? 1 2

? 1 3

? 2 3

! 3 1 2

提示

测试数据满足 1N10001 \le N \le 1000