Submission #1362082

#TimeUsernameProblemLanguageResultExecution timeMemory
1362082SulAInside information (BOI21_servers)C++20
5 / 100
136 ms54376 KiB
#include <bits/stdc++.h>
using namespace std;

struct block {
    int first, last;
    bool inc = true, dec = true;

    block(int x = 0) : first(x), last(x) {}

    friend block operator+ (const block& A, const block& B) {
        block res;
        res.first = A.first;
        res.last = B.last;
        res.inc = A.inc && A.last < B.first && B.inc;
        res.dec = A.dec && A.last > B.first && B.dec;
        return res;
    }

};

const int N = 120'001, K = 17;
vector<pair<int,int>> adj[N];
int dep[N], par[K][N];
block info[K][N];

void dfs(int u, int p = -1) {
    for (auto [v, w] : adj[u]) {
        if (v == p) continue;
        par[0][v] = u;
        info[0][v] = w;
        for (int i = 0; i < K-1; i++) {
            par[i+1][v]  = par[i][par[i][v]];
            info[i+1][v] = info[i][v] + info[i][par[i][v]];
        }
        dep[v] = dep[u] + 1;
        dfs(v, u);
    }
}

block flip(block B) {
    swap(B.first, B.last);
    swap(B.inc, B.dec);
    return B;
}

block query(int u, int v) {
//    cout<<u<<' '<<v<<'\n';
    block resu = -1, resv = -1;
    if (dep[u] > dep[v]) {
        int d = dep[u] - dep[v];
        for (int k = K-1; k >= 0; k--) {
            if ((d >> k) & 1) {
                resu = resu.first == -1 ? info[k][u] : resu + info[k][u];
                u = par[k][u];
            }
        }
    }
//    assert(dep[u] == dep[v]);
    if (u == v) return resu;

    if (dep[u] < dep[v]) {
        int d = dep[v] - dep[u];
        for (int k = K-1; k >= 0; k--) {
            if ((d >> k) & 1) {
//                cout<<v<<' '<<par[k][v]<<' '<<info[k][v].first<<' '<<info[k][v].last<<"\n";
                resv = resv.first == -1 ? info[k][v] : resv + info[k][v];
                v = par[k][v];
            }
        }
    }
//    assert(dep[u] == dep[v]);
    if (u == v) return flip(resv);

    for (int k = 17; k >= 0; k--) {
        if (par[k][u] != par[k][v]) {
            resu = resu.first == -1 ? info[k][u] : resu + info[k][u];
            resv = resv.first == -1 ? info[k][v] : resv + info[k][v];
            u = par[k][u];
            v = par[k][v];
        }
    }
    resu = resu + info[0][u];
    resv = resv + info[0][v];
    return resu + flip(resv);
}

int main() {
    int n,k; cin >> n >> k;
    vector<tuple<int,int,int>> qu;
    for (int i = 1, u, v; i <= n+k-1; i++) {
        char t; cin >> t >> u >> v;
        if (t == 'S') {
            adj[u].emplace_back(v, i);
            adj[v].emplace_back(u, i);
        } else {
            qu.emplace_back(u, v, i);
        }
    }
    dfs(1);
    for (auto [u, v, t] : qu) {
        auto b = query(v, u);
        cout << (b.inc && b.last < t ? "yes" : "no") << "\n";
    }
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...