답안 #750914

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
750914 2023-05-30T14:00:42 Z drdilyor Drawing (CEOI22_drawing) C++17
30 / 100
1500 ms 18296 KB
#include<bits/stdc++.h>

using namespace std;
using ll = long long;
const int inf = 1e9;
const ll infl = 1e18;
mt19937 rng;

using pt = pair<int,int>;
bool ccw(pt A, pt B, pt C) {
    return ll(C.second-A.second) * (B.first-A.first) > ll(B.second-A.second) * (C.first-A.first);
}
bool intersect(pt A, pt B, pt C, pt D) {
    return ccw(A, C, D) != ccw(B, C, D) && ccw(A, B, C) != ccw(A, B, D);
}

int main() {

    int n;
    cin >> n;

    vector<vector<int>> adj(n);
    vector<pair<int,int>> pts(n);
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        u--;v--;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    map<pair<int,int>, int> ix;
    for (auto& [x, y] : pts)
        cin >> x >> y;
    for (int i = 0; i < n; i++)
        ix[pts[i]]= i;

    int r = 0;
    for (; r < n; r++)
        if (adj[r].size() < 3) break;

    vector<int> res(n, -1);
    vector<int> subs(n, 1);
    auto dfs_sz = [&](auto& dfs_sz, int i, int p=-1)->void {
        for (int e : adj[i]) if (e != p) {
            dfs_sz(dfs_sz, e, i);
            subs[i] += subs[e];
        }
    };
    dfs_sz(dfs_sz, r);

    auto dfs = [&](auto& dfs, vector<pair<int,int>>::iterator p1, vector<pair<int,int>>::iterator p2, int i, int p =-1)->void {
        vector<int> ch;
        for (int e : adj[i]) {
            if (e != p) ch.push_back(e);
        }
        if (ch.empty()) {
            assert(p1 == p2);
            return;
        }
        if (ch.size() == 1) {
            res[ch[0]] = ix[*--p2];
            dfs(dfs, p1, p2, ch[0], i);
        } else {
            sort(p1, p2, [](auto& p, auto& q)->bool {
                return (ll)p.second * q.first > (ll) q.second * p.first;
            });
            assert(p2 - p1 == subs[ch[0]] + subs[ch[1]]);
            sort(p1, p1 + subs[ch[0]]);
            sort(p1 + subs[ch[0]], p2);
            auto q1 = p1 + subs[ch[0]];
            auto q2 = p2;
            p2 = q1;
            res[ch[0]] = ix[*--p2];
            res[ch[1]] = ix[*--q2];
            dfs(dfs, p1, p2, ch[0], i);
            dfs(dfs, q1, q2, ch[1], i);
        }
    };

    sort(pts.begin(), pts.end(), greater());
    res[r] = ix[pts.back()];
    pts.pop_back();
    dfs(dfs, pts.begin(), pts.end(), r);

    vector<int> byp(n);
    for (int i = 0; i < n; i++)
        assert(res[i] >= 0),
        byp[res[i]] = i;
    for (int i : byp) {
        cout << i+1 << ' ';
    }
    cout << '\n';

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 599 ms 16472 KB Output is correct
2 Execution timed out 1593 ms 18296 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 852 KB Output is correct
2 Correct 123 ms 1088 KB Output is correct
3 Correct 304 ms 1140 KB Output is correct
4 Correct 9 ms 1452 KB Output is correct
5 Correct 21 ms 1440 KB Output is correct
6 Correct 13 ms 832 KB Output is correct
7 Correct 10 ms 936 KB Output is correct
8 Correct 14 ms 832 KB Output is correct
9 Correct 216 ms 1304 KB Output is correct
10 Correct 203 ms 968 KB Output is correct
11 Correct 8 ms 1364 KB Output is correct
12 Correct 13 ms 1192 KB Output is correct
13 Correct 14 ms 852 KB Output is correct
14 Correct 9 ms 980 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 852 KB Output is correct
2 Correct 123 ms 1088 KB Output is correct
3 Correct 304 ms 1140 KB Output is correct
4 Correct 9 ms 1452 KB Output is correct
5 Correct 21 ms 1440 KB Output is correct
6 Correct 13 ms 832 KB Output is correct
7 Correct 10 ms 936 KB Output is correct
8 Correct 14 ms 832 KB Output is correct
9 Correct 216 ms 1304 KB Output is correct
10 Correct 203 ms 968 KB Output is correct
11 Correct 8 ms 1364 KB Output is correct
12 Correct 13 ms 1192 KB Output is correct
13 Correct 14 ms 852 KB Output is correct
14 Correct 9 ms 980 KB Output is correct
15 Correct 34 ms 1624 KB Output is correct
16 Correct 1150 ms 2888 KB Output is correct
17 Correct 1366 ms 2064 KB Output is correct
18 Correct 19 ms 3412 KB Output is correct
19 Correct 58 ms 3128 KB Output is correct
20 Correct 39 ms 1624 KB Output is correct
21 Correct 25 ms 2260 KB Output is correct
22 Correct 45 ms 1620 KB Output is correct
23 Correct 677 ms 2252 KB Output is correct
24 Correct 1423 ms 2120 KB Output is correct
25 Correct 21 ms 3636 KB Output is correct
26 Correct 53 ms 3388 KB Output is correct
27 Correct 39 ms 1996 KB Output is correct
28 Correct 25 ms 2412 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 852 KB Output is correct
2 Correct 123 ms 1088 KB Output is correct
3 Correct 304 ms 1140 KB Output is correct
4 Correct 9 ms 1452 KB Output is correct
5 Correct 21 ms 1440 KB Output is correct
6 Correct 13 ms 832 KB Output is correct
7 Correct 10 ms 936 KB Output is correct
8 Correct 14 ms 832 KB Output is correct
9 Correct 216 ms 1304 KB Output is correct
10 Correct 203 ms 968 KB Output is correct
11 Correct 8 ms 1364 KB Output is correct
12 Correct 13 ms 1192 KB Output is correct
13 Correct 14 ms 852 KB Output is correct
14 Correct 9 ms 980 KB Output is correct
15 Correct 34 ms 1624 KB Output is correct
16 Correct 1150 ms 2888 KB Output is correct
17 Correct 1366 ms 2064 KB Output is correct
18 Correct 19 ms 3412 KB Output is correct
19 Correct 58 ms 3128 KB Output is correct
20 Correct 39 ms 1624 KB Output is correct
21 Correct 25 ms 2260 KB Output is correct
22 Correct 45 ms 1620 KB Output is correct
23 Correct 677 ms 2252 KB Output is correct
24 Correct 1423 ms 2120 KB Output is correct
25 Correct 21 ms 3636 KB Output is correct
26 Correct 53 ms 3388 KB Output is correct
27 Correct 39 ms 1996 KB Output is correct
28 Correct 25 ms 2412 KB Output is correct
29 Correct 399 ms 14160 KB Output is correct
30 Execution timed out 1580 ms 15360 KB Time limit exceeded
31 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 599 ms 16472 KB Output is correct
2 Execution timed out 1593 ms 18296 KB Time limit exceeded
3 Halted 0 ms 0 KB -