제출 #1330238

#제출 시각아이디문제언어결과실행 시간메모리
1330238shirokuma5Drawing (CEOI22_drawing)C++20
100 / 100
129 ms33524 KiB
/*# pragma GCC target("avx2")
# pragma GCC optimize("O3")
# pragma GCC optimize("unroll-loops")*/
#include<bits/stdc++.h>
using ll = long long;
using namespace std;
const ll mod = 998244353;
const ll INF = 1LL << 60;
const int MAX = 1e9 + 10;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rep1(i, n) for (int i = 1; i <= (int)(n); i++)
#define rep2(i, l, r) for (int i = (l); i < (int)(r); i++)
#define repd(i, n) for (int i = (int)(n) - 1; i >= 0; i--)
#define repd1(i, n) for (int i = (int)(n); i >= 1; i--)
#define repd2(i, l, r) for (int i = (int)(r) - 1; i >= (int)(l); i--)

template<class T> bool chmin(T &a, T b) {
    if (a > b) {
        a = b; return 1;
    }
    return 0;
}
template<class T> bool chmax(T &a, T b) {
    if (a < b) {
        a = b; return 1;
    }
    return 0;
}
struct edge {
    int to, w;
};
ll inv(ll a) {
    ll b = mod, u = 1, v = 0;
    while(b) {
        ll t = a / b;
        a -= b * t;
        swap(a, b);
        u -= v * t;
        swap(u, v);
    }
    u %= mod;
    if (u < 0) u += mod;
    return u;
}
template<class T> void print(vector<T> a) {
    int n = a.size();
    for (int i = 0; i < n; i++) cout << a[i] << " ";
    cout << endl;
}
template<class T> int low_idx(const vector<T> &a, T x) {
    return distance(a.begin(), lower_bound(a.begin(), a.end(), x));
}
template<class T> bool next_combination(T &bit, int N) {
    T x = bit & -bit, y = bit + x;
    bit = (((bit & ~y) / x) >> 1) | y;
    return (bit < (1LL << N));
}
int next_combination(int sub) {
    int x = sub & -sub, y = sub + x;
    return (((sub & ~y) / x) >> 1) | y;
}

vector<int> route;
vector<vector<int>> G;
void dfs(int now = 1, int pre = -1) {
    route.push_back(now);
    for (int nex : G[now]) if (nex != pre) dfs(nex, now);
}

struct Line {
    ll a, b;
    Line(ll x_1, ll y_1, ll x_2, ll y_2) { // y軸平行でないとき
        a = (y_2 - y_1) / (x_2 - x_1);
        b = -a * x_1 + y_1;
    }
};
bool above(Line l, int x, int y) {
    return y > l.a * x + l.b;
}

int main() {
    ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int n; cin >> n;
    G.resize(n + 1); route.reserve(n + 10);
    rep(i, n - 1) {
        int u, v; cin >> u >> v;
        G[u].push_back(v); G[v].push_back(u);
    }
    dfs();
    vector<tuple<int, int, int>> points(n);
    rep(i, n) {
        cin >> get<0>(points[i]) >> get<1>(points[i]);
        get<2>(points[i]) = i;
    }

    // 凸包を求める
    sort(points.begin(), points.end());
    int l = 1, r = n-1;
    Line L(get<0>(points[0]), get<1>(points[0]), get<0>(points[n-1]), get<1>(points[n-1]));
    vector<int> rev(n, -1); rev[get<2>(points[0])] = 0;
    rep1(i, n-1) {
        auto [x, y, id] = points[i];
        if (above(L, x, y)) rev[id] = l++;
        else rev[id] = r--;
    }

    vector<int> res(n);
    rep(i, n) res[i] = route[rev[i]];
    print(res);

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...