답안 #796693

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
796693 2023-07-28T15:44:25 Z rnl42 Mergers (JOI19_mergers) C++14
70 / 100
303 ms 161880 KB
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <cassert>
using namespace std;
#define int long long

const int MAXN = 5e5;

int N, K;
int dist[MAXN];
vector<int> adj[MAXN];
int group_of[MAXN];
vector<int> members[MAXN];
struct lcatreeitem {
    int i;
    lcatreeitem& operator=(int other) {
        i = other;
        return *this;
    }
    operator int() const {
        return i;
    }
    bool operator<(const lcatreeitem& other) const {
        if (i == -1) return false;
        else if (other.i == -1) return true;
        return dist[i] < dist[other.i];
    }
} lcatree[1<<20];
int first[MAXN];
int lcatree_i = 0;
const int lcatree_shift = 1<<19;
int mergeuntil[MAXN];
bool penible[MAXN];

int uf[MAXN];

int root(int u) {
    return uf[u] == u ? u : uf[u] = root(uf[u]);
}
void merge(int u, int v) {
    if (dist[u] > dist[v]) {
        swap(u, v);
    }
    uf[root(v)] = root(u);
}

void dfs(int u) {
    first[u] = lcatree_i;
    lcatree[lcatree_shift+lcatree_i++] = u;
    for (int v : adj[u]) {
        adj[v].erase(find(adj[v].begin(), adj[v].end(), u));
        dist[v] = dist[u]+1;
        dfs(v);
        lcatree[lcatree_shift+lcatree_i++] = u;
    }
}

int dfs2(int u) {
    int ret = mergeuntil[u];
    for (int v : adj[u]) {
        int r = dfs2(v);
        if (dist[r] < dist[ret]) ret = r;
        if (r != v) {
            merge(v, u);
        }
    }
    return ret;
}

int lca(int u, int v) {
    assert(u >= 0 && v >= 0 && u < N && v < N);
    if (first[u] > first[v]) swap(u, v);
    int l = lcatree_shift+first[u], r = lcatree_shift+first[v]+1;
    lcatreeitem ret;
    ret = -1;
    for (; l < r; l >>= 1, r >>= 1) {
        if (l&1) {
            assert(l >= 0 && l < 1e6);
            ret = min(ret, lcatree[l++]);
        }
        if (r&1) {
            assert(r >= 0 && r < 1e6);
            ret = min(ret, lcatree[--r]);
        }
    }
    return ret;
}

int dfs3(int u) {
    int ret = 0;
    for (int v : adj[u]) {
        ret += dfs3(v);
    }
    ret = max(ret, (int)penible[u]);
    return ret;
}

signed main() {
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    cin >> N >> K;
    iota(mergeuntil, mergeuntil+N, 0);
    iota(uf, uf+N, 0);
    int u, v;
    for (int i = 0; i < N-1; i++) {
        cin >> u >> v, u--, v--;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
    for (int i = 0; i < N; i++) {
        cin >> group_of[i], group_of[i]--;
        members[group_of[i]].push_back(i);
    }
    dfs(0);
    for (int i = lcatree_shift-1; i > 0; i--) {
        lcatree[i] = min(lcatree[2*i], lcatree[2*i+1]);
    }
    for (int g = 0; g < K; g++) {
        int a = members[g][0];
        for (auto m : members[g]) {
            a = lca(a, m);
        }
        for (auto m : members[g]) {
            mergeuntil[m] = a;
        }
    }
    dfs2(0);
    bool plus1 = false;
    int lcapenible = -1;
    for (int i = 1; i < N; i++) {
        if (root(i) == i) {
            if (lcapenible == -1) lcapenible = i;
            else lcapenible = lca(lcapenible, i);
            penible[i] = true;
        }
    }
    for (int i = 1; i < N; i++) {
        if (penible[i]) {
            if (lca(lcapenible, i) == i) {
                plus1 = true;
                break;
            }
        }
    }
    int ans = dfs3(0)+plus1;
    cout << ((ans+1)>>1) << '\n';
}
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 27848 KB Output is correct
2 Correct 17 ms 27912 KB Output is correct
3 Correct 15 ms 27860 KB Output is correct
4 Correct 15 ms 27860 KB Output is correct
5 Correct 15 ms 27896 KB Output is correct
6 Correct 17 ms 27888 KB Output is correct
7 Correct 18 ms 27860 KB Output is correct
8 Correct 18 ms 27860 KB Output is correct
9 Correct 18 ms 27912 KB Output is correct
10 Correct 14 ms 27880 KB Output is correct
11 Correct 14 ms 27928 KB Output is correct
12 Correct 16 ms 27904 KB Output is correct
13 Correct 14 ms 27928 KB Output is correct
14 Correct 14 ms 27924 KB Output is correct
15 Correct 14 ms 27860 KB Output is correct
16 Correct 14 ms 27872 KB Output is correct
17 Correct 14 ms 27956 KB Output is correct
18 Correct 14 ms 27860 KB Output is correct
19 Correct 15 ms 27848 KB Output is correct
20 Correct 14 ms 27872 KB Output is correct
21 Correct 15 ms 27908 KB Output is correct
22 Correct 18 ms 27860 KB Output is correct
23 Correct 15 ms 27924 KB Output is correct
24 Correct 16 ms 27896 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 27848 KB Output is correct
2 Correct 17 ms 27912 KB Output is correct
3 Correct 15 ms 27860 KB Output is correct
4 Correct 15 ms 27860 KB Output is correct
5 Correct 15 ms 27896 KB Output is correct
6 Correct 17 ms 27888 KB Output is correct
7 Correct 18 ms 27860 KB Output is correct
8 Correct 18 ms 27860 KB Output is correct
9 Correct 18 ms 27912 KB Output is correct
10 Correct 14 ms 27880 KB Output is correct
11 Correct 14 ms 27928 KB Output is correct
12 Correct 16 ms 27904 KB Output is correct
13 Correct 14 ms 27928 KB Output is correct
14 Correct 14 ms 27924 KB Output is correct
15 Correct 14 ms 27860 KB Output is correct
16 Correct 14 ms 27872 KB Output is correct
17 Correct 14 ms 27956 KB Output is correct
18 Correct 14 ms 27860 KB Output is correct
19 Correct 15 ms 27848 KB Output is correct
20 Correct 14 ms 27872 KB Output is correct
21 Correct 15 ms 27908 KB Output is correct
22 Correct 18 ms 27860 KB Output is correct
23 Correct 15 ms 27924 KB Output is correct
24 Correct 16 ms 27896 KB Output is correct
25 Correct 16 ms 27928 KB Output is correct
26 Correct 16 ms 28312 KB Output is correct
27 Correct 15 ms 28220 KB Output is correct
28 Correct 18 ms 28628 KB Output is correct
29 Correct 19 ms 28268 KB Output is correct
30 Correct 16 ms 28316 KB Output is correct
31 Correct 17 ms 27912 KB Output is correct
32 Correct 16 ms 28492 KB Output is correct
33 Correct 18 ms 27924 KB Output is correct
34 Correct 16 ms 28324 KB Output is correct
35 Correct 17 ms 28256 KB Output is correct
36 Correct 15 ms 28232 KB Output is correct
37 Correct 18 ms 28336 KB Output is correct
38 Correct 14 ms 27892 KB Output is correct
39 Correct 15 ms 28288 KB Output is correct
40 Correct 15 ms 28320 KB Output is correct
41 Correct 15 ms 28260 KB Output is correct
42 Correct 15 ms 28336 KB Output is correct
43 Correct 15 ms 28484 KB Output is correct
44 Correct 13 ms 27920 KB Output is correct
45 Correct 15 ms 28316 KB Output is correct
46 Correct 19 ms 28316 KB Output is correct
47 Correct 14 ms 27860 KB Output is correct
48 Correct 16 ms 28244 KB Output is correct
49 Correct 17 ms 28356 KB Output is correct
50 Correct 18 ms 28440 KB Output is correct
51 Correct 16 ms 28304 KB Output is correct
52 Correct 16 ms 28348 KB Output is correct
53 Correct 16 ms 28320 KB Output is correct
54 Correct 15 ms 28244 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 27848 KB Output is correct
2 Correct 17 ms 27912 KB Output is correct
3 Correct 15 ms 27860 KB Output is correct
4 Correct 15 ms 27860 KB Output is correct
5 Correct 15 ms 27896 KB Output is correct
6 Correct 17 ms 27888 KB Output is correct
7 Correct 18 ms 27860 KB Output is correct
8 Correct 18 ms 27860 KB Output is correct
9 Correct 18 ms 27912 KB Output is correct
10 Correct 14 ms 27880 KB Output is correct
11 Correct 14 ms 27928 KB Output is correct
12 Correct 16 ms 27904 KB Output is correct
13 Correct 14 ms 27928 KB Output is correct
14 Correct 14 ms 27924 KB Output is correct
15 Correct 14 ms 27860 KB Output is correct
16 Correct 14 ms 27872 KB Output is correct
17 Correct 14 ms 27956 KB Output is correct
18 Correct 14 ms 27860 KB Output is correct
19 Correct 15 ms 27848 KB Output is correct
20 Correct 14 ms 27872 KB Output is correct
21 Correct 15 ms 27908 KB Output is correct
22 Correct 18 ms 27860 KB Output is correct
23 Correct 15 ms 27924 KB Output is correct
24 Correct 16 ms 27896 KB Output is correct
25 Correct 13 ms 27892 KB Output is correct
26 Correct 57 ms 38700 KB Output is correct
27 Correct 88 ms 38484 KB Output is correct
28 Correct 17 ms 28320 KB Output is correct
29 Correct 16 ms 27860 KB Output is correct
30 Correct 14 ms 27976 KB Output is correct
31 Correct 67 ms 38488 KB Output is correct
32 Correct 16 ms 28244 KB Output is correct
33 Correct 79 ms 45080 KB Output is correct
34 Correct 86 ms 38464 KB Output is correct
35 Correct 17 ms 28244 KB Output is correct
36 Correct 114 ms 38684 KB Output is correct
37 Correct 15 ms 28236 KB Output is correct
38 Correct 14 ms 28244 KB Output is correct
39 Correct 55 ms 38672 KB Output is correct
40 Correct 16 ms 28500 KB Output is correct
41 Correct 88 ms 38272 KB Output is correct
42 Correct 96 ms 40248 KB Output is correct
43 Correct 15 ms 27860 KB Output is correct
44 Correct 86 ms 45264 KB Output is correct
45 Correct 78 ms 42920 KB Output is correct
46 Correct 16 ms 28324 KB Output is correct
47 Correct 19 ms 28244 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 63 ms 38920 KB Output is correct
2 Correct 88 ms 40836 KB Output is correct
3 Correct 15 ms 28320 KB Output is correct
4 Correct 15 ms 28312 KB Output is correct
5 Correct 14 ms 27916 KB Output is correct
6 Correct 17 ms 27988 KB Output is correct
7 Correct 17 ms 28304 KB Output is correct
8 Correct 115 ms 39348 KB Output is correct
9 Correct 20 ms 28244 KB Output is correct
10 Correct 75 ms 38632 KB Output is correct
11 Correct 15 ms 27892 KB Output is correct
12 Correct 73 ms 38132 KB Output is correct
13 Correct 80 ms 39164 KB Output is correct
14 Correct 120 ms 40592 KB Output is correct
15 Correct 60 ms 38676 KB Output is correct
16 Correct 15 ms 28344 KB Output is correct
17 Correct 14 ms 28048 KB Output is correct
18 Correct 71 ms 40424 KB Output is correct
19 Correct 102 ms 43964 KB Output is correct
20 Correct 16 ms 28244 KB Output is correct
21 Correct 17 ms 27924 KB Output is correct
22 Correct 83 ms 39580 KB Output is correct
23 Correct 16 ms 28312 KB Output is correct
24 Correct 76 ms 38764 KB Output is correct
25 Correct 99 ms 43468 KB Output is correct
26 Correct 16 ms 28320 KB Output is correct
27 Correct 17 ms 28316 KB Output is correct
28 Correct 17 ms 28320 KB Output is correct
29 Correct 17 ms 28324 KB Output is correct
30 Correct 17 ms 28244 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 27848 KB Output is correct
2 Correct 17 ms 27912 KB Output is correct
3 Correct 15 ms 27860 KB Output is correct
4 Correct 15 ms 27860 KB Output is correct
5 Correct 15 ms 27896 KB Output is correct
6 Correct 17 ms 27888 KB Output is correct
7 Correct 18 ms 27860 KB Output is correct
8 Correct 18 ms 27860 KB Output is correct
9 Correct 18 ms 27912 KB Output is correct
10 Correct 14 ms 27880 KB Output is correct
11 Correct 14 ms 27928 KB Output is correct
12 Correct 16 ms 27904 KB Output is correct
13 Correct 14 ms 27928 KB Output is correct
14 Correct 14 ms 27924 KB Output is correct
15 Correct 14 ms 27860 KB Output is correct
16 Correct 14 ms 27872 KB Output is correct
17 Correct 14 ms 27956 KB Output is correct
18 Correct 14 ms 27860 KB Output is correct
19 Correct 15 ms 27848 KB Output is correct
20 Correct 14 ms 27872 KB Output is correct
21 Correct 15 ms 27908 KB Output is correct
22 Correct 18 ms 27860 KB Output is correct
23 Correct 15 ms 27924 KB Output is correct
24 Correct 16 ms 27896 KB Output is correct
25 Correct 16 ms 27928 KB Output is correct
26 Correct 16 ms 28312 KB Output is correct
27 Correct 15 ms 28220 KB Output is correct
28 Correct 18 ms 28628 KB Output is correct
29 Correct 19 ms 28268 KB Output is correct
30 Correct 16 ms 28316 KB Output is correct
31 Correct 17 ms 27912 KB Output is correct
32 Correct 16 ms 28492 KB Output is correct
33 Correct 18 ms 27924 KB Output is correct
34 Correct 16 ms 28324 KB Output is correct
35 Correct 17 ms 28256 KB Output is correct
36 Correct 15 ms 28232 KB Output is correct
37 Correct 18 ms 28336 KB Output is correct
38 Correct 14 ms 27892 KB Output is correct
39 Correct 15 ms 28288 KB Output is correct
40 Correct 15 ms 28320 KB Output is correct
41 Correct 15 ms 28260 KB Output is correct
42 Correct 15 ms 28336 KB Output is correct
43 Correct 15 ms 28484 KB Output is correct
44 Correct 13 ms 27920 KB Output is correct
45 Correct 15 ms 28316 KB Output is correct
46 Correct 19 ms 28316 KB Output is correct
47 Correct 14 ms 27860 KB Output is correct
48 Correct 16 ms 28244 KB Output is correct
49 Correct 17 ms 28356 KB Output is correct
50 Correct 18 ms 28440 KB Output is correct
51 Correct 16 ms 28304 KB Output is correct
52 Correct 16 ms 28348 KB Output is correct
53 Correct 16 ms 28320 KB Output is correct
54 Correct 15 ms 28244 KB Output is correct
55 Correct 13 ms 27892 KB Output is correct
56 Correct 57 ms 38700 KB Output is correct
57 Correct 88 ms 38484 KB Output is correct
58 Correct 17 ms 28320 KB Output is correct
59 Correct 16 ms 27860 KB Output is correct
60 Correct 14 ms 27976 KB Output is correct
61 Correct 67 ms 38488 KB Output is correct
62 Correct 16 ms 28244 KB Output is correct
63 Correct 79 ms 45080 KB Output is correct
64 Correct 86 ms 38464 KB Output is correct
65 Correct 17 ms 28244 KB Output is correct
66 Correct 114 ms 38684 KB Output is correct
67 Correct 15 ms 28236 KB Output is correct
68 Correct 14 ms 28244 KB Output is correct
69 Correct 55 ms 38672 KB Output is correct
70 Correct 16 ms 28500 KB Output is correct
71 Correct 88 ms 38272 KB Output is correct
72 Correct 96 ms 40248 KB Output is correct
73 Correct 15 ms 27860 KB Output is correct
74 Correct 86 ms 45264 KB Output is correct
75 Correct 78 ms 42920 KB Output is correct
76 Correct 16 ms 28324 KB Output is correct
77 Correct 19 ms 28244 KB Output is correct
78 Correct 63 ms 38920 KB Output is correct
79 Correct 88 ms 40836 KB Output is correct
80 Correct 15 ms 28320 KB Output is correct
81 Correct 15 ms 28312 KB Output is correct
82 Correct 14 ms 27916 KB Output is correct
83 Correct 17 ms 27988 KB Output is correct
84 Correct 17 ms 28304 KB Output is correct
85 Correct 115 ms 39348 KB Output is correct
86 Correct 20 ms 28244 KB Output is correct
87 Correct 75 ms 38632 KB Output is correct
88 Correct 15 ms 27892 KB Output is correct
89 Correct 73 ms 38132 KB Output is correct
90 Correct 80 ms 39164 KB Output is correct
91 Correct 120 ms 40592 KB Output is correct
92 Correct 60 ms 38676 KB Output is correct
93 Correct 15 ms 28344 KB Output is correct
94 Correct 14 ms 28048 KB Output is correct
95 Correct 71 ms 40424 KB Output is correct
96 Correct 102 ms 43964 KB Output is correct
97 Correct 16 ms 28244 KB Output is correct
98 Correct 17 ms 27924 KB Output is correct
99 Correct 83 ms 39580 KB Output is correct
100 Correct 16 ms 28312 KB Output is correct
101 Correct 76 ms 38764 KB Output is correct
102 Correct 99 ms 43468 KB Output is correct
103 Correct 16 ms 28320 KB Output is correct
104 Correct 17 ms 28316 KB Output is correct
105 Correct 17 ms 28320 KB Output is correct
106 Correct 17 ms 28324 KB Output is correct
107 Correct 17 ms 28244 KB Output is correct
108 Runtime error 303 ms 161880 KB Execution killed with signal 11
109 Halted 0 ms 0 KB -