Submission #582741

#TimeUsernameProblemLanguageResultExecution timeMemory
582741elkernosJail (JOI22_jail)C++17
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>

using namespace std;

struct digraph {
    vector<vector<int>> g;
    vector<int> deg;
    digraph(int n) : g(n), deg(n) {}
    void add(int a, int b)
    {
        g[a].push_back(b);
        deg[b]++;
    }
    bool query(int n)
    {
        queue<int> q;
        for(int i = 0; i < n; i++) {
            if(deg[i] == 0) {
                q.push(i);
            }
        }
        while(!q.empty()) {
            int x = q.front();
            q.pop();
            for(int y : g[x]) {
                deg[y]--;
                if(deg[y] == 0) {
                    q.push(y);
                }
            }
        }
        if(*max_element(deg.begin(), deg.begin() + n)) {
            return 0;
        }
        return 1;
    }
};

const int magic = 17;

void test_case()
{
    int n;
    cin >> n;
    vector<vector<int>> g(n + 1);
    for(int i = 1; i < n; i++) {
        int a, b;
        cin >> a >> b;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    vector<vector<int>> jump(magic, vector<int>(n + 1));
    vector<int> dep(n + 1);
    function<void(int, int)> dfs = [&](int u, int p) {
        for(int to : g[u]) {
            if(to == p) {
                continue;
            }
            jump[0][to] = u;
            dep[to] = dep[u] + 1;
            dfs(to, u);
        }
    };
    dfs(1, -1);
    for(int i = 1; i < magic; i++) {
        for(int j = 1; j <= n; j++) {
            jump[i][j] = jump[i - 1][jump[i - 1][j]];
        }
    }
    auto startIdx = [&](int i, int j) {
        return (i + 1) * n + j - 1;
    };
    auto endIdx = [&](int i, int j) {
        return (i + 18) * n + j - 1;
    };
    digraph dg(36 * n);
    for(int i = 1; i < magic; i++) {
        for(int j = 1; j <= n; j++) {
            if(dep[j] + 1 >= (1 << i)) {
                dg.add(startIdx(i, j), startIdx(i - 1, j));
                dg.add(startIdx(i, j), startIdx(i - 1, jump[i - 1][j]));
                dg.add(endIdx(i - 1, j), endIdx(i, j));
                dg.add(endIdx(i - 1, jump[i - 1][j]), endIdx(i, j));
            }
        }
    }
    auto anc = [&](int a, int len) {
        for(int i = 0; len > 0; i++) {
            if(len % 2 == 1) {
                a = jump[i][a];
            }
            len /= 2;
        }
        return a;
    };
    auto lca = [&](int a, int b) {
        if(dep[a] > dep[b]) swap(a, b);
        b = anc(b, dep[b] - dep[a]);
        if(a == b) {
            return a;
        }
        for(int i = magic - 1; i >= 0; i--) {
            if(jump[i][a] != jump[i][b]) {
                a = jump[i][a];
                b = jump[i][b];
            }
        }
        return jump[0][a];
    };
	int m;
	cin >> m;
    for(int i = 0; i < m; i++) {
        int a, b;
        cin >> a >> b;
        dg.add(startIdx(0, a), i);
        dg.add(i, endIdx(0, b));
        int l = lca(a, b);
        auto addEdge = [&](int v, int len) {
            if(len <= 0) {
                return;
            }
            int it = __lg(len);
            int w = anc(v, len - (1 << it));
            dg.add(i, startIdx(it, v));
            dg.add(i, startIdx(it, w));
            dg.add(endIdx(it, v), i);
            dg.add(endIdx(it, w), i);
        };
        addEdge(jump[0][a], dep[a] - dep[l] - 1);
        addEdge(jump[0][b], dep[b] - dep[l] - 1);
        dg.add(endIdx(0, a), i);
        dg.add(i, startIdx(0, b));
        if(a != l) {
            dg.add(i, startIdx(0, l));
        }
        if(b != l) {
            dg.add(endIdx(0, l), i);
        }
    }
    cout << (dg.query(36 * n) ? "Yes" : "No" << "\n";
}

int main()
{
    cin.tie(nullptr)->sync_with_stdio(0);
    int q;
    cin >> q;
    while(q--) {
        test_case();
    }
}

Compilation message (stderr)

jail.cpp: In function 'void test_case()':
jail.cpp:140:46: error: invalid operands of types 'const char [3]' and 'const char [2]' to binary 'operator<<'
  140 |     cout << (dg.query(36 * n) ? "Yes" : "No" << "\n";
      |                                         ~~~~ ^~ ~~~~
      |                                         |       |
      |                                         |       const char [2]
      |                                         const char [3]
jail.cpp:140:53: error: expected ')' before ';' token
  140 |     cout << (dg.query(36 * n) ? "Yes" : "No" << "\n";
      |             ~                                       ^
      |                                                     )