답안 #540409

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
540409 2022-03-20T10:05:50 Z elazarkoren Inside information (BOI21_servers) C++17
2.5 / 100
108 ms 93388 KB
#include <bits/stdc++.h>
#define x first
#define y second
#define all(v) v.begin(), v.end()
#define chkmin(a, b) a = min(a, b)
#define chkmax(a, b) a = max(a, b)
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> pii;
typedef vector<pii> vii;
typedef vector<bool> vb;

const int MAX_N = 2e5;
const int infinity = 1e9;

vii tree[MAX_N];

int depth[MAX_N];
pii dp[20][MAX_N];// weight[MAX_N];
int increase[MAX_N], decrease[MAX_N];
int loga[MAX_N];

void Dfs(int node, int parent, int w, int len_i, int len_d, int dist) {
    depth[node] = dist;
    dp[0][node] = {parent, w};
//    weight[node] = w;
    increase[node] = len_i, decrease[node] = len_d;
    for (auto [neighbor, d] : tree[node]) {
        if (neighbor == parent) continue;
        Dfs(neighbor, node, d, (w > d ? len_i : 0) + 1, (w < d ? len_d : 0) + 1, dist + 1);
    }
}

bool Dfs(int node, int end, int w) {
    if (node == end) return true;
    for (auto [neighbor, d] : tree[node]) {
        if (d >= w) continue;
        if (Dfs(neighbor, end, d)) {
            return true;
        }
    }
    return false;
}

int Dfs(int node, int w) {
    int c = 1;
    for (auto [neighbor, d] : tree[node]) {
        if (d <= w) continue;
        c += Dfs(neighbor, d);
    }
    return c;
}

int n, q;

pii Jump(int a, int k) {
    int max_w = 0;
    for (int i = 0; i <= loga[n]; i++) {
        if ((k >> i) & 1) {
            chkmax(max_w, dp[i][a].y);
            a = dp[i][a].x;
        }
    }
    return {a, max_w};
}

int Solve(int v, int u) {
    if (u == v) return 0;
    int a = v, b = u;
    int max_w = 0;
    if (depth[a] > depth[b]) {
        pii p = Jump(a, depth[a] - depth[b]);
        a = p.x, max_w = p.y;
    } else {
        pii p = Jump(b, depth[b] - depth[a]);
        b = p.x, max_w = p.y;
    }
    bool bad = a != b;
    for (int i = loga[n]; i >= 0; i--) {
        if (dp[i][a].x != dp[i][b].x) {
            chkmax(max_w, dp[i][a].y);
            chkmax(max_w, dp[i][b].y);
            a = dp[i][a].x, b = dp[i][b].x;
        }
    }
    int dep_lca = depth[a] - bad;
    if (bad) {
        chkmax(max_w, dp[0][a].y);
        chkmax(max_w, dp[0][b].y);
    }
    if (dep_lca < depth[v] - decrease[v] || dep_lca < depth[u] - increase[u]) {
        return infinity;
    }
    return (!bad || dp[0][a].y > dp[0][b].y ? max_w : infinity);
}

char type[MAX_N];
int a[MAX_N], d[MAX_N];

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> q;
    for (int i = 0; i < n + q - 1; i++) {
        cin >> type[i];
        if (type[i] == 'S') {
            int A, b;
            cin >> A >> b;
            tree[A].push_back({b, i});
            tree[b].push_back({A, i});
        } else if (type[i] == 'Q') {
//            int a, d;
            cin >> a[i] >> d[i];
//            cout << (Dfs(a, d, infinity) ? "yes\n" : "no\n");
        } else {
//            int d;
            cin >> d[i];
//            cout << Dfs(d, -1) << '\n';
        }
    }
    for (int i = 2; i <= n; i++) {
        loga[i] = loga[i >> 1] + 1;
    }
    Dfs(1, 0, 0, 0, 0, 0);
    for (int i = 1; i <= loga[n]; i++) {
        for (int j = 1; j <= n; j++) {
            dp[i][j].x = dp[i - 1][dp[i - 1][j].x].x;
            dp[i][j].y = max(dp[i - 1][j].y, dp[i - 1][dp[i - 1][j].x].y);
        }
    }
    for (int i = 0; i < n + q - 1; i++) {
        if (type[i] == 'Q') {
            cout << (Solve(a[i], d[i]) <= i ? "yes\n" : "no\n");
        } else if (type[i] == 'C') {
            cout << Dfs(d[i], -1) << '\n';
        }
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 6412 KB Output is correct
2 Correct 36 ms 7188 KB Output is correct
3 Correct 31 ms 7272 KB Output is correct
4 Correct 41 ms 7408 KB Output is correct
5 Correct 37 ms 7500 KB Output is correct
6 Correct 42 ms 7332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 6412 KB Output is correct
2 Correct 36 ms 7188 KB Output is correct
3 Correct 31 ms 7272 KB Output is correct
4 Correct 41 ms 7408 KB Output is correct
5 Correct 37 ms 7500 KB Output is correct
6 Correct 42 ms 7332 KB Output is correct
7 Incorrect 26 ms 6608 KB Extra information in the output file
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 6484 KB Output is correct
2 Runtime error 94 ms 92832 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 6484 KB Output is correct
2 Runtime error 94 ms 92832 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 6476 KB Output is correct
2 Runtime error 102 ms 90796 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 6476 KB Output is correct
2 Runtime error 102 ms 90796 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 6380 KB Output is correct
2 Runtime error 108 ms 93388 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 6380 KB Output is correct
2 Runtime error 108 ms 93388 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 6492 KB Output is correct
2 Runtime error 108 ms 90676 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 6492 KB Output is correct
2 Runtime error 108 ms 90676 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 6496 KB Output is correct
2 Correct 39 ms 7212 KB Output is correct
3 Correct 32 ms 7244 KB Output is correct
4 Correct 41 ms 7372 KB Output is correct
5 Correct 38 ms 7480 KB Output is correct
6 Correct 29 ms 7244 KB Output is correct
7 Correct 22 ms 6576 KB Output is correct
8 Runtime error 98 ms 92808 KB Execution killed with signal 11
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 6496 KB Output is correct
2 Correct 39 ms 7212 KB Output is correct
3 Correct 32 ms 7244 KB Output is correct
4 Correct 41 ms 7372 KB Output is correct
5 Correct 38 ms 7480 KB Output is correct
6 Correct 29 ms 7244 KB Output is correct
7 Correct 22 ms 6576 KB Output is correct
8 Runtime error 98 ms 92808 KB Execution killed with signal 11
9 Halted 0 ms 0 KB -