답안 #1022360

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1022360 2024-07-13T12:19:57 Z mdn2002 분수 공원 (IOI21_parks) C++17
5 / 100
2178 ms 174112 KB
/*
Mayoeba Yabureru
*/
#include "parks.h"
#include<bits/stdc++.h>
using namespace std;
static vector<int> _u, _v, _a, _b;

int construct_roads(vector<int> x, vector<int> y) {
    int n = x.size();
    vector<vector<int>> gr(n + 1);
    vector<int> dsu(n + 1);
    map<pair<int, int>, int> mp;
    map<pair<int, int>, pair<int, int>> mpp;
    vector<pair<int, int>> vv;
    x.insert(x.begin(), 0);
    y.insert(y.begin(), 0);
    for (int i = 1; i <= n; i ++) {
        mp[{x[i], y[i]}] = i;
        vv.push_back({x[i], y[i]});
        dsu[i] = i;
    }
    vector<int> u, v, a, b;
    map<pair<int, int>, int> taken;
    map<pair<int, int>, int> connected;

    function<int(int)> fp = [&](int x) {
        if (dsu[x] == x) return x;
        return dsu[x] = fp(dsu[x]);
    };
    function cmp = [&] (pair<int, int> a, pair<int, int> b) {
        if (a.first + a.second < b.first + b.second) return 1;
        return 0;
    };
    sort(vv.begin(), vv.end(), cmp);
    for (int i = 0; i < n; i ++) {
        vector nx = {0}, ny = {2};
        for (int j = 0; j < 1; j ++) {
            auto xx = make_pair(vv[i].first + nx[j], vv[i].second + ny[j]);
            if (mp[xx]) {
                int fx = fp(mp[vv[i]]), fy = fp(mp[xx]);
                if (fx != fy) {
                    u.push_back(mp[vv[i]]);
                    v.push_back(mp[xx]);

                    gr[mp[vv[i]]].push_back(mp[xx]);
                    gr[mp[xx]].push_back(mp[vv[i]]);

                    dsu[fx] = fy;
                    connected[{mp[vv[i]], mp[xx]}] = 1;
                    connected[{mp[xx], mp[vv[i]]}] = 1;
                    int ad = vv[i].second % 4;
                    if (ad == 2) {
                        mpp[{mp[vv[i]], mp[xx]}] = {vv[i].first - 1, vv[i].second + 1};
                        taken[{vv[i].first - 1, vv[i].second + 1}] = 1;
                    }
                    else {
                        mpp[{mp[vv[i]], mp[xx]}] = {vv[i].first + 1, vv[i].second + 1};
                        taken[{vv[i].first + 1, vv[i].second + 1}] = 1;
                    }
                }
            }
        }
    }
    for (int i = 0; i < n; i ++) {
        vector nx = {2, -2}, ny = {0, 0};
        for (int j = 0; j < 4; j ++) {
            auto xx = make_pair(vv[i].first + nx[j], vv[i].second + ny[j]);
            if (mp[xx]) {
                int fx = fp(mp[vv[i]]), fy = fp(mp[xx]);
                if (fx != fy) {
                    if (vv[i].first < xx.first || vv[i].second < xx.second) {
                        u.push_back(mp[vv[i]]);
                        v.push_back(mp[xx]);
                    }
                    else {
                        v.push_back(mp[vv[i]]);
                        u.push_back(mp[xx]);
                    }
                    gr[mp[vv[i]]].push_back(mp[xx]);
                    gr[mp[xx]].push_back(mp[vv[i]]);
                    dsu[fx] = fy;
                    connected[{mp[vv[i]], mp[xx]}] = 1;
                    connected[{mp[xx], mp[vv[i]]}] = 1;
                }
            }
        }
    }

    int num = 0, st = 1;
    vector<int> vis(n + 1);
    for (int i = 1; i <= n; i ++) {
        if (mp[{x[i], y[i] + 2}]) {
            st = i;
            break;
        }
    }

    function<void(int)> go = [&] (int v) {
        num ++;
        vis[v] = 1;
        vector nx = {0, 2, 0, -2}, ny = {2, 0, -2, 0};
        int ii = 0;
        for (int i = 0; i < 4; i ++) {
            int u = mp[{x[v] + nx[i], y[v] + ny[i]}];
            if (u == 0) continue;
            if (vis[u]) {
                ii = (i + 1) % 4;
                break;
            }
        }
        int nummmm = 10;
        while (nummmm --) {
            int i = ii;
            ii = (ii + 1) % 4;
            int u = mp[{x[v] + nx[i], y[v] + ny[i]}];
            if (u == 0 || vis[u] || connected[{u, v}] == 0) continue;
            if (x[v] != x[u]) {
                int xx = v, uu = u;
                if (x[xx] > x[uu]) {
                    if (taken[{x[uu] + 1, y[uu] - 1}] == 0) {
                        mpp[{uu, xx}] = {x[uu] + 1, y[uu] - 1};
                        taken[{x[uu] + 1, y[uu] - 1}] = 1;
                    }
                    else if (taken[{x[uu] + 1, y[uu] + 1}] == 0) {
                        mpp[{uu, xx}] = {x[uu] + 1, y[uu] + 1};
                        taken[{x[uu] + 1, y[uu] + 1}] = 1;
                    }
                    else assert(0);
                }
                else {
                    if (taken[{x[xx] + 1, y[xx] + 1}] == 0) {
                        mpp[{xx, uu}] = {x[xx] + 1, y[xx] + 1};
                        taken[{x[xx] + 1, y[xx] + 1}] = 1;
                    }
                    else if (taken[{x[xx] + 1, y[xx] - 1}] == 0) {
                        mpp[{xx, uu}] = {x[xx] + 1, y[xx] - 1};
                        taken[{x[xx] + 1, y[xx] - 1}] = 1;
                    }
                    else assert(0);
                }
            }
            go(u);
        }
    };
    go(st);
    for (int i = 0; i < u.size(); i ++) {
        a.push_back(mpp[{u[i], v[i]}].first);
        b.push_back(mpp[{u[i], v[i]}].second);
        u[i] --;
        v[i] --;
    }
    if (num == n) {
        build(u, v, a, b);
        return 1;
    }
    return 0;
}

Compilation message

parks.cpp: In function 'int construct_roads(std::vector<int>, std::vector<int>)':
parks.cpp:147:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  147 |     for (int i = 0; i < u.size(); i ++) {
      |                     ~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 432 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 0 ms 440 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 850 ms 86092 KB Output is correct
10 Correct 43 ms 9040 KB Output is correct
11 Correct 340 ms 48036 KB Output is correct
12 Correct 65 ms 13684 KB Output is correct
13 Correct 204 ms 34560 KB Output is correct
14 Correct 4 ms 856 KB Output is correct
15 Correct 6 ms 1644 KB Output is correct
16 Correct 756 ms 73796 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 432 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 0 ms 440 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 850 ms 86092 KB Output is correct
10 Correct 43 ms 9040 KB Output is correct
11 Correct 340 ms 48036 KB Output is correct
12 Correct 65 ms 13684 KB Output is correct
13 Correct 204 ms 34560 KB Output is correct
14 Correct 4 ms 856 KB Output is correct
15 Correct 6 ms 1644 KB Output is correct
16 Correct 756 ms 73796 KB Output is correct
17 Correct 1 ms 348 KB Output is correct
18 Correct 0 ms 348 KB Output is correct
19 Correct 0 ms 348 KB Output is correct
20 Correct 1 ms 600 KB Output is correct
21 Correct 1 ms 348 KB Output is correct
22 Correct 0 ms 348 KB Output is correct
23 Correct 1904 ms 161736 KB Output is correct
24 Runtime error 1 ms 604 KB Execution killed with signal 6
25 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 432 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 0 ms 440 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 850 ms 86092 KB Output is correct
10 Correct 43 ms 9040 KB Output is correct
11 Correct 340 ms 48036 KB Output is correct
12 Correct 65 ms 13684 KB Output is correct
13 Correct 204 ms 34560 KB Output is correct
14 Correct 4 ms 856 KB Output is correct
15 Correct 6 ms 1644 KB Output is correct
16 Correct 756 ms 73796 KB Output is correct
17 Correct 1 ms 348 KB Output is correct
18 Correct 0 ms 348 KB Output is correct
19 Correct 0 ms 348 KB Output is correct
20 Correct 1 ms 600 KB Output is correct
21 Correct 1 ms 348 KB Output is correct
22 Correct 0 ms 348 KB Output is correct
23 Correct 1904 ms 161736 KB Output is correct
24 Runtime error 1 ms 604 KB Execution killed with signal 6
25 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 432 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 0 ms 440 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 850 ms 86092 KB Output is correct
10 Correct 43 ms 9040 KB Output is correct
11 Correct 340 ms 48036 KB Output is correct
12 Correct 65 ms 13684 KB Output is correct
13 Correct 204 ms 34560 KB Output is correct
14 Correct 4 ms 856 KB Output is correct
15 Correct 6 ms 1644 KB Output is correct
16 Correct 756 ms 73796 KB Output is correct
17 Correct 0 ms 348 KB Output is correct
18 Correct 1 ms 432 KB Output is correct
19 Correct 1 ms 348 KB Output is correct
20 Runtime error 1324 ms 168084 KB Execution killed with signal 6
21 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 432 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 0 ms 440 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 850 ms 86092 KB Output is correct
10 Correct 43 ms 9040 KB Output is correct
11 Correct 340 ms 48036 KB Output is correct
12 Correct 65 ms 13684 KB Output is correct
13 Correct 204 ms 34560 KB Output is correct
14 Correct 4 ms 856 KB Output is correct
15 Correct 6 ms 1644 KB Output is correct
16 Correct 756 ms 73796 KB Output is correct
17 Correct 2027 ms 174112 KB Output is correct
18 Correct 2178 ms 160408 KB Output is correct
19 Runtime error 1375 ms 167840 KB Execution killed with signal 6
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 432 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 0 ms 440 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 850 ms 86092 KB Output is correct
10 Correct 43 ms 9040 KB Output is correct
11 Correct 340 ms 48036 KB Output is correct
12 Correct 65 ms 13684 KB Output is correct
13 Correct 204 ms 34560 KB Output is correct
14 Correct 4 ms 856 KB Output is correct
15 Correct 6 ms 1644 KB Output is correct
16 Correct 756 ms 73796 KB Output is correct
17 Correct 1 ms 348 KB Output is correct
18 Correct 0 ms 348 KB Output is correct
19 Correct 0 ms 348 KB Output is correct
20 Correct 1 ms 600 KB Output is correct
21 Correct 1 ms 348 KB Output is correct
22 Correct 0 ms 348 KB Output is correct
23 Correct 1904 ms 161736 KB Output is correct
24 Runtime error 1 ms 604 KB Execution killed with signal 6
25 Halted 0 ms 0 KB -