제출 #520818

#제출 시각아이디문제언어결과실행 시간메모리
520818tengiz05Amusement Park (JOI17_amusement_park)C++17
100 / 100
38 ms6892 KiB
#include "Joi.h"
#include <bits/stdc++.h>

using i64 = long long;
using namespace std;

namespace joi {
    const int MAX_BIT = 60;
    int n;
    vector<vector<int>> e, adj;
    vector<bool> vis;
    void dfs(int u) {
        vis[u] = true;
        for (int v : adj[u]) {
            if (!vis[v]) {
                e[u].push_back(v);
                e[v].push_back(u);
                dfs(v);
            }
        }
    }
    int cnt = 0;
    set<int> s;
    vector<set<int>> f;
    vector<int> val(n);
    void find(int u, int p) {
        val[u] = cnt++;
        if (cnt == MAX_BIT) {
            return;
        }
        for (int v : e[u]) {
            if (v != p) {
                f[u].insert(v);
                f[v].insert(u);
                find(v, u);
                if (cnt == MAX_BIT)
                    return;
            }
        }
    }
    void mark(int u, int p) {
        bool in = false, op1 = false, op2 = false;
        int x = -1, to = -1;
        if (val[u] == -1) {
            in = true;
            auto t = s.begin();
            if (*t == p) t++;
            x = *t;
            to = *f[x].begin();
            s.erase(x);
            f[x].erase(to);
            f[to].erase(x);
            if (f[to].size() == 1) {
                op1 = true;
                s.insert(to);
            }
            if (f[p].size() == 1) {
                op2 = true;
                s.erase(p);
            }
            f[p].insert(u);
            f[u].insert(p);
            s.insert(u);
            val[u] = val[x];
        }
        for (int v : e[u]) {
            if (v != p) {
                mark(v, u);
            }
        }
        if (in) {
            s.erase(u);
            f[p].erase(u);
            f[u].erase(p);
            if (op2) {
                s.insert(p);
            }
            if (op1) {
                s.erase(to);
            }
            f[x].insert(to);
            f[to].insert(x);
            s.insert(x);
        }
    }
};
using namespace joi;

void Joi(int N, int M, int A[], int B[], long long X, int T) {
    n = N;
    adj.resize(n);
    e.resize(n);
    for (int i = 0; i < M; i++) {
        adj[A[i]].push_back(B[i]);
        adj[B[i]].push_back(A[i]);
    }
    vis.assign(n, 0);
    dfs(0);
    
    f.resize(n);
    val.resize(n, -1);
    find(0, -1);
    
    for (int i = 0; i < n; i++) {
        if (f[i].size() == 1) {
            s.insert(i);
        }
    }
    
    mark(0, -1);
    
    for (int i = 0; i < n; i++) {
        assert(val[i] != -1);
        MessageBoard(i, X >> val[i] & 1);
    }
}
#include "Ioi.h"
#include <bits/stdc++.h>

using i64 = long long;
using namespace std;

namespace ioi {
    const int MAX_BIT = 60;
    int n;
    vector<vector<int>> e, adj;
    vector<bool> vis;
    void dfs(int u) {
        vis[u] = true;
        for (int v : adj[u]) {
            if (!vis[v]) {
                e[u].push_back(v);
                e[v].push_back(u);
                dfs(v);
            }
        }
    }
    int cnt = 0;
    set<int> s;
    vector<set<int>> f;
    vector<int> val(n);
    void find(int u, int p) {
        val[u] = cnt++;
        if (cnt == MAX_BIT) {
            return;
        }
        for (int v : e[u]) {
            if (v != p) {
                f[u].insert(v);
                f[v].insert(u);
                find(v, u);
                if (cnt == MAX_BIT)
                    return;
            }
        }
    }
    void mark(int u, int p) {
        bool in = false, op1 = false, op2 = false;
        int x = -1, to = -1;
        if (val[u] == -1) {
            in = true;
            auto t = s.begin();
            if (*t == p) t++;
            x = *t;
            to = *f[x].begin();
            s.erase(x);
            f[x].erase(to);
            f[to].erase(x);
            if (f[to].size() == 1) {
                op1 = true;
                s.insert(to);
            }
            if (f[p].size() == 1) {
                op2 = true;
                s.erase(p);
            }
            f[p].insert(u);
            f[u].insert(p);
            s.insert(u);
            val[u] = val[x];
        }
        for (int v : e[u]) {
            if (v != p) {
                mark(v, u);
            }
        }
        if (in) {
            s.erase(u);
            f[p].erase(u);
            f[u].erase(p);
            if (op2) {
                s.insert(p);
            }
            if (op1) {
                s.erase(to);
            }
            f[x].insert(to);
            f[to].insert(x);
            s.insert(x);
        }
    }
    vector<bool> h(MAX_BIT);
    i64 ans = 0;
    void get(int u) {
        for (int v : e[u]) {
            if (!h[val[v]]) {
                int x = Move(v);
                ans |= (1LL * x) << val[v];
                h[val[v]] = true;
                get(v);
                Move(u);
            }
        }
    }
};
using namespace ioi;
long long Ioi(int N, int M, int A[], int B[], int u, int V, int T) {
    n = N;
    adj.resize(n);
    e.resize(n);
    for (int i = 0; i < M; i++) {
        adj[A[i]].push_back(B[i]);
        adj[B[i]].push_back(A[i]);
    }
    vis.assign(n, 0);
    dfs(0);
    
    f.resize(n);
    val.resize(n, -1);
    find(0, -1);
    
    for (int i = 0; i < n; i++) {
        if (f[i].size() == 1) {
            s.insert(i);
        }
    }
    
    mark(0, -1);
    
    h[val[u]] = 0;
    ans = (1LL * V) << val[u];
    get(u);
    
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...