码迷,mamicode.com
首页 > 其他好文 > 详细

1254C

时间:2020-01-28 09:34:55      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:close   cli   main   splay   pair   ace   its   连线   $1   

交互

问题就是如何确定点的顺序

只有一个点肯定不行 需要除$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;
}
View Code

 

1254C

标签:close   cli   main   splay   pair   ace   its   连线   $1   

原文地址:https://www.cnblogs.com/19992147orz/p/12237283.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!