답안 #107442

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
107442 2019-04-24T10:27:14 Z szawinis Amusement Park (JOI17_amusement_park) C++17
83 / 100
139 ms 5892 KB
#include "Joi.h"
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+1;

struct Solver_Joi {
    int n, m, mxd, mxdv, color[N], last[N];
    long long X;
    vector<int> g1[N], g2[N];

    bool vis[N];
    int par[N], depth[N];
    void init_dfs(int u) {
        vis[u] = true;
        if(depth[u] > mxd) {
            mxd = depth[u];
            mxdv = u;
        }
        for(int v: g1[u]) {
            if(vis[v]) continue;
            g2[u].push_back(v);
            par[v] = u;
            depth[v] = depth[u] + 1;
            init_dfs(v);
        }
    }

    void colorBig(int u) {
        color[u] = depth[u] % 60;
        for(int v: g2[u]) {
            colorBig(v);
        }
    }

    int curr_count;
    int st[N];
    vector<int> ord;

    void prepColorSmall1(int u) {
        color[u] = (curr_count >= 60 ? -1 : curr_count);
        ++curr_count;

        if (color[u] != -1) {
            st[u] = ord.size();
            ord.push_back(u);
        }

        for (int v: g2[u]) {
            prepColorSmall1(v);
            if(color[u] != -1 && ord.back() != u) ord.push_back(u);
        }
    }

    void solve() {
        par[0] = -1;
        fill(color, color+N, -1);
        fill(last, last+N, -1);
        init_dfs(0);

        if(mxd >= 59) {
            colorBig(0);
            for(int i = 0; i < n; i++) {
                assert(color[i] != -1 && 0 <= color[i] && color[i] < 60);
                MessageBoard(i, X >> color[i] & 1);
            }
            return;
        }

        prepColorSmall1(0);
//        for(int x: ord) cerr << x << ' ';
//        cerr << endl;

        for(int i = 0; i < n; i++) {
            last[i] = i;
            while(color[last[i]] == -1) last[i] = par[last[i]];
        }

        for(int i = 0; i < n; i++) {
            if(color[i] != -1) continue;

            int idx = st[last[i]];
            int depth_diff = depth[i] - depth[last[i]];

            set<int> distinct_mods;
            while(distinct_mods.size() < 60 - depth_diff) {
                distinct_mods.insert(color[ord[idx]]);
                idx = (idx + 1) % ord.size();
            }

            for(int mod = 0; mod < 60; mod++) {
                if(!distinct_mods.count(mod)) {
                    color[i] = mod;
                    break;
                }
            }
            assert(ord[st[last[i]]] == last[i]);

//            cerr << i << ' ' << last[i] << ' ' << color[i] << endl;
        }

        for(int i = 0; i < n; i++) {
            assert(color[i] != -1 && 0 <= color[i] && color[i] < 60);
            MessageBoard(i, X >> color[i] & 1);
        }
    }

    Solver_Joi(int n, int m, long long X, int A[], int B[]): n(n), m(m), X(X) {
        for(int i = 0; i < m; i++) {
            g1[A[i]].push_back(B[i]);
            g1[B[i]].push_back(A[i]);
        }
    }
};

void Joi(int n, int m, int A[], int B[], long long X, int T) {
    Solver_Joi *solver = new Solver_Joi(n, m, X, A, B);
    solver->solve();
}
#include "Ioi.h"
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+1;

struct Solver_Ioi {
    int n, m, mxd, mxdv, P, V, color[N], last[N];
    long long X;
    vector<int> g1[N], g2[N];

    bool vis[N];
    int par[N], depth[N];

    void init_dfs(int u) {
        vis[u] = true;
        if (depth[u] > mxd) {
            mxd = depth[u];
            mxdv = u;
        }
        for (int v: g1[u]) {
            if (vis[v]) continue;
            g2[u].push_back(v);
            par[v] = u;
            depth[v] = depth[u] + 1;
            init_dfs(v);
        }
    }

    void colorBig(int u) {
        color[u] = depth[u] % 60;
        for (int v: g2[u]) {
            colorBig(v);
        }
    }

    int curr_count;
    int st[N];
    vector<int> ord;

    void prepColorSmall1(int u) {
        color[u] = (curr_count >= 60 ? -1 : curr_count);
        ++curr_count;

        if (color[u] != -1) {
            st[u] = ord.size();
            ord.push_back(u);
        }

        for (int v: g2[u]) {
            prepColorSmall1(v);
            if(color[u] != -1 && ord.back() != u) ord.push_back(u);
        }
    }

    void traverseUp(int v, int offset, set<int> &distinct_mods) { // check both cases where v is in top set and bottom set
        assert(v == last[v]);
        int idx = st[v];
        while(distinct_mods.size() < 60 - offset) {
            long long tmp = Move(ord[idx]);
            assert(color[ord[idx]] != -1);
            X |= tmp << color[ord[idx]];
            distinct_mods.insert(color[ord[idx]]);
            idx = (idx + 1) % ord.size();
        }
        // is this inclusive or exclusive?
        // this function assumes that v has not been visited yet
    }

    void solve() {
        par[0] = -1;
        fill(color, color + N, -1);
        fill(last, last + N, -1);
        init_dfs(0);

        if (mxd >= 59) {
            set<int> distinct_mods;
            colorBig(0);
            distinct_mods.insert(color[P]);
            X |= 1ll * V << color[P];
            for(int v = par[P]; v >= 0 && distinct_mods.size() < 60; v = par[v]) {
                long long tmp = Move(v);
                distinct_mods.insert(color[v]);
                X |= tmp << color[v];
            }
            vector<int> ord;
            for(int v = mxdv; v > 0; v = par[v]) ord.push_back(v);
            reverse(ord.begin(), ord.end());
            for(int v: ord) {
                if(distinct_mods.size() >= 60) break;
                long long tmp = Move(v);
                distinct_mods.insert(color[v]);
                X |= tmp << color[v];
            }
            return;
        }

        prepColorSmall1(0);
        ord.pop_back();
//        for(int x: ord) cerr << x << ' ';
//        cerr << endl;

        for (int i = 0; i < n; i++) {
            last[i] = i;
            while (color[last[i]] == -1) last[i] = par[last[i]];
        }

        for(int i = 0; i < n; i++) {
            if(color[i] != -1) continue;

            int idx = st[last[i]];
            int depth_diff = depth[i] - depth[last[i]];

            set<int> distinct_mods;
            while(distinct_mods.size() < 60 - depth_diff) {
                distinct_mods.insert(color[ord[idx]]);
                idx = (idx + 1) % ord.size();
            }

            for(int mod = 0; mod < 60; mod++) {
                if(!distinct_mods.count(mod)) {
                    color[i] = mod;
                    break;
                }
            }
            assert(ord[st[last[i]]] == last[i]);

//            cerr << i << ' ' << last[i] << ' ' << color[i] << endl;
        }

        set<int> distinct_mods;
        distinct_mods.insert(color[P]);
        X |= 1ll * V << color[P];

        if(last[P] == P) {
            int nxt = ord[(st[P] + 1) % ord.size()];
            assert(last[nxt] == nxt);
            traverseUp(nxt, 0, distinct_mods);
        } else {
            int v;
            for(v = par[P]; last[v] != v; v = par[v]) {
                long long tmp = Move(v);
                distinct_mods.insert(color[v]);
                X |= tmp << color[v];
            }
//            traverseUp(v, depth[v] - depth[last[v]], distinct_mods);
            traverseUp(v, 0, distinct_mods);
        }

    }

    Solver_Ioi(int n, int m, int P, int V, int A[], int B[]) : n(n), m(m), P(P), V(V) {
        for (int i = 0; i < m; i++) {
            g1[A[i]].push_back(B[i]);
            g1[B[i]].push_back(A[i]);
        }
    }
};

long long Ioi(int n, int m, int A[], int B[], int P, int V, int T) {
    Solver_Ioi *solverIoi = new Solver_Ioi(n, m, P, V, A, B);
    solverIoi->solve();
    return solverIoi->X;
}

Compilation message

Joi.cpp: In member function 'void Solver_Joi::solve()':
Joi.cpp:85:40: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             while(distinct_mods.size() < 60 - depth_diff) {
                   ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~

Ioi.cpp: In member function 'void Solver_Ioi::traverseUp(int, int, std::set<int>&)':
Ioi.cpp:58:36: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while(distinct_mods.size() < 60 - offset) {
               ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~
Ioi.cpp: In member function 'void Solver_Ioi::solve()':
Ioi.cpp:114:40: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             while(distinct_mods.size() < 60 - depth_diff) {
                   ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 1940 KB Output is correct
2 Correct 6 ms 1944 KB Output is correct
3 Correct 10 ms 2060 KB Output is correct
4 Correct 5 ms 1792 KB Output is correct
5 Correct 6 ms 1792 KB Output is correct
6 Correct 6 ms 1964 KB Output is correct
7 Correct 6 ms 2200 KB Output is correct
8 Correct 8 ms 2180 KB Output is correct
9 Correct 9 ms 2156 KB Output is correct
10 Correct 7 ms 2176 KB Output is correct
11 Correct 9 ms 2236 KB Output is correct
12 Correct 6 ms 1920 KB Output is correct
13 Correct 8 ms 2060 KB Output is correct
14 Correct 9 ms 1944 KB Output is correct
15 Correct 10 ms 2172 KB Output is correct
16 Correct 9 ms 2184 KB Output is correct
17 Correct 9 ms 2324 KB Output is correct
18 Correct 7 ms 2060 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 40 ms 5704 KB Output is correct
2 Correct 34 ms 5892 KB Output is correct
3 Correct 37 ms 5632 KB Output is correct
4 Correct 118 ms 4104 KB Output is correct
5 Correct 27 ms 4804 KB Output is correct
6 Correct 25 ms 4504 KB Output is correct
7 Correct 22 ms 4524 KB Output is correct
8 Correct 25 ms 4496 KB Output is correct
9 Correct 20 ms 4496 KB Output is correct
10 Correct 100 ms 3960 KB Output is correct
11 Correct 109 ms 4008 KB Output is correct
12 Correct 86 ms 3920 KB Output is correct
13 Correct 115 ms 3824 KB Output is correct
14 Correct 103 ms 4236 KB Output is correct
15 Correct 111 ms 4388 KB Output is correct
16 Correct 127 ms 4256 KB Output is correct
17 Correct 127 ms 4240 KB Output is correct
18 Correct 113 ms 4116 KB Output is correct
19 Correct 105 ms 4344 KB Output is correct
20 Correct 20 ms 4496 KB Output is correct
21 Correct 19 ms 4648 KB Output is correct
22 Correct 23 ms 4272 KB Output is correct
23 Correct 27 ms 4488 KB Output is correct
24 Correct 27 ms 4276 KB Output is correct
25 Correct 25 ms 4232 KB Output is correct
26 Correct 28 ms 4476 KB Output is correct
27 Correct 27 ms 4504 KB Output is correct
28 Correct 22 ms 4696 KB Output is correct
29 Correct 19 ms 4220 KB Output is correct
30 Correct 20 ms 4280 KB Output is correct
31 Correct 8 ms 1920 KB Output is correct
32 Correct 6 ms 2092 KB Output is correct
33 Correct 6 ms 1924 KB Output is correct
34 Correct 8 ms 1792 KB Output is correct
35 Correct 6 ms 2056 KB Output is correct
36 Correct 6 ms 1928 KB Output is correct
37 Correct 6 ms 1968 KB Output is correct
38 Correct 7 ms 1928 KB Output is correct
39 Correct 6 ms 2056 KB Output is correct
40 Correct 7 ms 1792 KB Output is correct
41 Correct 6 ms 2056 KB Output is correct
42 Correct 6 ms 1920 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 1928 KB Output is correct
2 Correct 6 ms 1940 KB Output is correct
3 Correct 5 ms 1972 KB Output is correct
4 Correct 8 ms 2468 KB Output is correct
5 Correct 9 ms 2468 KB Output is correct
6 Correct 9 ms 2476 KB Output is correct
7 Correct 9 ms 2484 KB Output is correct
8 Correct 9 ms 2468 KB Output is correct
9 Correct 19 ms 5552 KB Output is correct
10 Correct 23 ms 5424 KB Output is correct
11 Correct 25 ms 5656 KB Output is correct
12 Correct 6 ms 1932 KB Output is correct
13 Correct 7 ms 1948 KB Output is correct
14 Correct 5 ms 1932 KB Output is correct
15 Correct 6 ms 1932 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 32 ms 5616 KB Output is correct
2 Correct 37 ms 5764 KB Output is correct
3 Correct 31 ms 5780 KB Output is correct
4 Correct 112 ms 4204 KB Output is correct
5 Correct 23 ms 5228 KB Output is correct
6 Correct 19 ms 4548 KB Output is correct
7 Correct 19 ms 4504 KB Output is correct
8 Correct 20 ms 4248 KB Output is correct
9 Correct 28 ms 4496 KB Output is correct
10 Correct 108 ms 3988 KB Output is correct
11 Correct 122 ms 4036 KB Output is correct
12 Correct 90 ms 3916 KB Output is correct
13 Correct 90 ms 3952 KB Output is correct
14 Correct 95 ms 3884 KB Output is correct
15 Correct 114 ms 4268 KB Output is correct
16 Correct 139 ms 4284 KB Output is correct
17 Correct 96 ms 4228 KB Output is correct
18 Correct 122 ms 4112 KB Output is correct
19 Correct 109 ms 4080 KB Output is correct
20 Correct 18 ms 4632 KB Output is correct
21 Correct 22 ms 4576 KB Output is correct
22 Correct 27 ms 4528 KB Output is correct
23 Correct 23 ms 4408 KB Output is correct
24 Correct 22 ms 4484 KB Output is correct
25 Correct 23 ms 4476 KB Output is correct
26 Correct 22 ms 4464 KB Output is correct
27 Correct 27 ms 4648 KB Output is correct
28 Correct 27 ms 4400 KB Output is correct
29 Correct 23 ms 4248 KB Output is correct
30 Correct 23 ms 4396 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 5756 KB Output is correct
2 Correct 35 ms 5840 KB Output is correct
3 Correct 35 ms 5780 KB Output is correct
4 Correct 126 ms 3936 KB Output is correct
5 Correct 25 ms 5360 KB Output is correct
6 Correct 28 ms 4456 KB Output is correct
7 Correct 23 ms 4508 KB Output is correct
8 Correct 24 ms 4792 KB Output is correct
9 Correct 23 ms 4560 KB Output is correct
10 Correct 126 ms 4012 KB Output is correct
11 Correct 124 ms 4336 KB Output is correct
12 Correct 87 ms 3984 KB Output is correct
13 Correct 130 ms 4080 KB Output is correct
14 Correct 87 ms 4044 KB Output is correct
15 Correct 137 ms 4272 KB Output is correct
16 Correct 99 ms 4364 KB Output is correct
17 Correct 103 ms 4208 KB Output is correct
18 Incorrect 90 ms 4136 KB Output isn't correct
19 Halted 0 ms 0 KB -