题解 - P10451 Innovative Business
思路
本题说:
关系具有反对称性,但不具有传递性。
这个性质满足归并排序的性质。
所以可以在归并排序的时候询问两两的大小关系,只需要加一个比较函数即可:
bool compare(int a, int b) {
cout << "? " << a << ' ' << b << endl;
bool t;
cin >> t;
return t;
}
代码
话不多说,直接上代码:
#include <iostream>
using namespace std;
const int N = 1e3 + 5;
int n;
int a[N];
int t[N];
bool compare(int a, int b) {
cout << "? " << a << ' ' << b << endl;
bool t;
cin >> t;
return t;
}
void Merge_sort(int le, int rt) {
if (le == rt)
return;
int mid = (le + rt) / 2;
Merge_sort(le, mid);
Merge_sort(mid + 1, rt);
int i = le, j = mid + 1, k = le;
while (i <= mid && j <= rt) {
if (compare(a[i], a[j])) {
t[k] = a[i];
i ++ ;
} else {
t[k] = a[j];
j ++ ;
}
k ++ ;
}
while (i <= mid) {
t[k] = a[i];
i ++ ;
k ++ ;
}
while (j <= rt) {
t[k] = a[j];
j ++ ;
k ++ ;
}
for (int x = le; x <= rt; x ++ )
a[x] = t[x];
}
void inp() {
cin >> n;
}
void work() {
for (int i = 1; i <= n; i ++ )
a[i] = i;
Merge_sort(1, n);
cout << "!";
for (int i = 1; i <= n; i ++ )
cout << " " << a[i];
puts("");
}
int main() {
inp();
work();
return 0;
}