交互
问题就是如何确定点的顺序
只有一个点肯定不行 需要除$1$号点找一个基准点 也就是和$1$号点相邻的点 这个可以通过$n$次叉积问出来
然后就是确定顺序 通过叉积确定比较困难 因为一次只能问出来两个点的相对顺序 这样需要$n^2$次
考虑面积询问 可以通过面积询问确定 其他点到两点连线距离 凸包上的点的距离先增加后减少 这样通过$n$次距离询问就可以确定顺序了
#include <bits/stdc++.h> using namespace std; typedef long long ll; int n; ll ask(int t, int i, int j, int k) { cout << t << " " << i << " " << j << " " << k << endl; ll ret; cin >> ret; return ret; } int main() { cin >> n; int piv = 2; for(int i = 3; i <= n; ++i) { if(ask(2, 1, piv, i) == -1) { piv = i; } } vector<pair<ll, int> > vec; for(int i = 2; i <= n; ++i) { if(i != piv) { vec.emplace_back(ask(1, 1, piv, i), i); } } sort(vec.begin(), vec.end()); reverse(vec.begin(), vec.end()); int far = vec[0].second; deque<int> q; q.push_back(far); for(int i = 1; i < vec.size(); ++i) { if(ask(2, 1, far, vec[i].second) == -1) { q.push_front(vec[i].second); } else { q.push_back(vec[i].second); } } q.push_front(piv); q.push_front(1); cout << "0"; for(auto x : q) { cout << " " << x; } return 0; }