답안 #108978

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
108978 2019-05-03T12:12:32 Z PeppaPig Amusement Park (JOI17_amusement_park) C++14
20 / 100
103 ms 24432 KB
#include "Joi.h"
#include <bits/stdc++.h>
 
#define long long long
#define pii pair<int, int>
#define x first
#define y second
 
using namespace std;
 
const int N = 1e4+5;
 
static vector<int> g[N];
static vector<pii> init;
static int pre[N], pos[N];
 
static void dfs(int u, int p) {
    static int idx = 0;
    pre[u] = idx++;
    for(int v : g[u]) if(v != p) dfs(v, u);
}
 
static void gen_tree(int n, int m, int A[], int B[]) {
    int par[N]; iota(par, par+N, 0);
    vector<pii> E;
    
    function<int(int)> find = [&](int x) { return par[x] = x == par[x] ? x : find(par[x]); };
 
    for(int i = 0; i < m; i++) {
        E.emplace_back(A[i], B[i]);
    }
    sort(E.begin(), E.end());
 
    vector<pii> ret;
    for(pii e : E) {
        int a, b; tie(a, b) = e;
        if(find(a) != find(b)) {
            par[find(a)] = find(b);
            g[a].emplace_back(b), g[b].emplace_back(a);
            ret.emplace_back(a, b);
        }
    } 
    dfs(0, 0);
    for(int i = 0; i < n; i++) if(pre[i] < 60) pos[i] = pre[i];
    for(pii e : ret) {
        int a, b; tie(a, b) = e;
        if(pre[a] < 60 && pre[b] < 60) init.emplace_back(a, b);
    }
}
 
static int deg[N];
static vector<pii> t[N];
 
static void extend_tree(int u, int p) {
    if(!t[u].empty()) return;
    vector<pii> v = t[p];
    for(pii e : v) {
        int a, b; tie(a, b) = e;
        ++deg[a], ++deg[b];
    }
    int leaf;
    for(pii e : v) {
        int a, b; tie(a, b) = e;
        if(deg[a] > deg[b]) swap(a, b);
        if(deg[a] == 1) { leaf = a; break; }
    }
    pos[u] = pos[leaf];
    for(pii e : v) {
        int a, b; tie(a, b) = e;
        --deg[a], --deg[b];
        if(a == leaf || b == leaf) continue;
        t[u].emplace_back(a, b);
    }
    t[u].emplace_back(u, p);
    for(int v : g[u]) if(v != p) extend_tree(v, u);
}
 
void Joi(int n, int m, int A[], int B[], long x, int T) {
    gen_tree(n, m, A, B);
 
    for(int i = 0; i < n; i++) if(pre[i] < 60) t[i] = init;
    for(int i = 0; i < n; i++) if(pre[i] < 60) for(int v : g[i]) extend_tree(v, i);
    for(int i = 0; i < n; i++) MessageBoard(i, x >> pos[i] & 1);
}
#include "Ioi.h"
#include <bits/stdc++.h>
 
#define long long long
#define pii pair<int, int>
#define x first
#define y second
 
using namespace std;
 
const int N = 1e4+5;
 
static vector<int> g[N];
static vector<pii> init;
static int pre[N], pos[N];
 
static void dfs(int u, int p) {
    static int idx = 0;
    pre[u] = idx++;
    for(int v : g[u]) if(v != p) dfs(v, u);
}
 
static void gen_tree(int n, int m, int A[], int B[]) {
    int par[N]; iota(par, par+N, 0);
    vector<pii> E;
    
    function<int(int)> find = [&](int x) { return par[x] = x == par[x] ? x : find(par[x]); };
 
    for(int i = 0; i < m; i++) {
        E.emplace_back(A[i], B[i]);
    }
    sort(E.begin(), E.end());
 
    vector<pii> ret;
    for(pii e : E) {
        int a, b; tie(a, b) = e;
        if(find(a) != find(b)) {
            par[find(a)] = find(b);
            g[a].emplace_back(b), g[b].emplace_back(a);
            ret.emplace_back(a, b);
        }
    } 
    dfs(0, 0);
    for(int i = 0; i < n; i++) if(pre[i] < 60) pos[i] = pre[i];
    for(pii e : ret) {
        int a, b; tie(a, b) = e;
        if(pre[a] < 60 && pre[b] < 60) init.emplace_back(a, b);
    }
}
 
static int deg[N];
static vector<pii> t[N];
 
static void extend_tree(int u, int p) {
    if(!t[u].empty()) return;
    vector<pii> v = t[p];
    for(pii e : v) {
        int a, b; tie(a, b) = e;
        ++deg[a], ++deg[b];
    }
    int leaf;
    for(pii e : v) {
        int a, b; tie(a, b) = e;
        if(deg[a] > deg[b]) swap(a, b);
        if(deg[a] == 1) { leaf = a; break; }
    }
    pos[u] = pos[leaf];
    for(pii e : v) {
        int a, b; tie(a, b) = e;
        --deg[a], --deg[b];
        if(a == leaf || b == leaf) continue;
        t[u].emplace_back(a, b);
    }
    t[u].emplace_back(u, p);
    for(int v : g[u]) if(v != p) extend_tree(v, u);
}
 
static long ans;
 
static void get_ans(int u, int p) {
    for(int v : g[u]) if(v != p) {
        int nex = Move(v);
        if(nex) ans += 1ll << pos[v];
        get_ans(v, u);
        Move(u);
    }
}
 
long Ioi(int n, int m, int A[], int B[], int P, int V, int T) {
    gen_tree(n, m, A, B);
 
    for(int i = 0; i < n; i++) if(pre[i] < 60) t[i] = init;
    for(int i = 0; i < n; i++) if(pre[i] < 60) for(int v : g[i]) extend_tree(v, i);
    for(int i = 0; i < n; i++) g[i].clear();
 
    if(V) ans += 1ll << pos[P];
    for(pii e : t[P]) g[e.x].emplace_back(e.y), g[e.y].emplace_back(e.x);
    get_ans(P, P);
 
    return ans;
}

Compilation message

Joi.cpp: In function 'void extend_tree(int, int)':
Joi.cpp:67:22: warning: 'leaf' may be used uninitialized in this function [-Wmaybe-uninitialized]
     pos[u] = pos[leaf];
              ~~~~~~~~^

Ioi.cpp: In function 'void extend_tree(int, int)':
Ioi.cpp:67:22: warning: 'leaf' may be used uninitialized in this function [-Wmaybe-uninitialized]
     pos[u] = pos[leaf];
              ~~~~~~~~^
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 1920 KB Output is correct
2 Correct 5 ms 1920 KB Output is correct
3 Correct 6 ms 2088 KB Output is correct
4 Incorrect 6 ms 1928 KB Wrong Answer [7]
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 77 ms 14484 KB Output is correct
2 Correct 80 ms 14456 KB Output is correct
3 Correct 83 ms 14328 KB Output is correct
4 Correct 52 ms 13808 KB Output is correct
5 Correct 71 ms 18648 KB Output is correct
6 Correct 73 ms 17072 KB Output is correct
7 Correct 71 ms 17260 KB Output is correct
8 Correct 72 ms 17844 KB Output is correct
9 Correct 60 ms 18028 KB Output is correct
10 Correct 50 ms 14124 KB Output is correct
11 Correct 66 ms 14204 KB Output is correct
12 Correct 55 ms 12984 KB Output is correct
13 Correct 52 ms 12812 KB Output is correct
14 Correct 66 ms 13320 KB Output is correct
15 Correct 55 ms 13816 KB Output is correct
16 Correct 55 ms 13884 KB Output is correct
17 Correct 52 ms 13784 KB Output is correct
18 Correct 64 ms 14112 KB Output is correct
19 Correct 67 ms 13804 KB Output is correct
20 Correct 51 ms 19136 KB Output is correct
21 Correct 53 ms 18924 KB Output is correct
22 Correct 74 ms 16516 KB Output is correct
23 Correct 73 ms 17960 KB Output is correct
24 Correct 74 ms 16984 KB Output is correct
25 Correct 71 ms 17664 KB Output is correct
26 Correct 103 ms 18248 KB Output is correct
27 Correct 61 ms 18052 KB Output is correct
28 Correct 74 ms 18176 KB Output is correct
29 Correct 55 ms 16408 KB Output is correct
30 Correct 64 ms 16852 KB Output is correct
31 Correct 6 ms 2048 KB Output is correct
32 Correct 4 ms 2164 KB Output is correct
33 Correct 7 ms 2100 KB Output is correct
34 Correct 7 ms 2144 KB Output is correct
35 Correct 6 ms 1964 KB Output is correct
36 Correct 7 ms 1792 KB Output is correct
37 Correct 5 ms 1992 KB Output is correct
38 Correct 4 ms 1920 KB Output is correct
39 Correct 6 ms 1920 KB Output is correct
40 Correct 6 ms 1928 KB Output is correct
41 Correct 5 ms 2056 KB Output is correct
42 Correct 4 ms 1964 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 1928 KB Output is correct
2 Correct 5 ms 1928 KB Output is correct
3 Correct 6 ms 1932 KB Output is correct
4 Correct 13 ms 5412 KB Output is correct
5 Correct 17 ms 5404 KB Output is correct
6 Correct 14 ms 5524 KB Output is correct
7 Correct 17 ms 5292 KB Output is correct
8 Correct 18 ms 5276 KB Output is correct
9 Correct 59 ms 24312 KB Output is correct
10 Correct 67 ms 24360 KB Output is correct
11 Correct 59 ms 24432 KB Output is correct
12 Correct 6 ms 1964 KB Output is correct
13 Correct 5 ms 1928 KB Output is correct
14 Correct 5 ms 2000 KB Output is correct
15 Correct 6 ms 1840 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 74 ms 14472 KB Output is correct
2 Correct 71 ms 14596 KB Output is correct
3 Correct 83 ms 14476 KB Output is correct
4 Correct 64 ms 13964 KB Output is correct
5 Incorrect 83 ms 21692 KB Wrong Answer [7]
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 87 ms 14548 KB Output is correct
2 Correct 80 ms 14560 KB Output is correct
3 Correct 95 ms 14596 KB Output is correct
4 Correct 68 ms 13876 KB Output is correct
5 Incorrect 82 ms 22744 KB Wrong Answer [7]
6 Halted 0 ms 0 KB -