제출 #1362089

#제출 시각아이디문제언어결과실행 시간메모리
1362089SulAInside information (BOI21_servers)C++20
48 / 100
196 ms54372 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) {
    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) {
                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 = K-1; 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.first == -1 ? info[0][u] : resu + info[0][u];
    resv = resv.first == -1 ? info[0][v] : 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 << (u == v || b.inc && b.last < t ? "yes" : "no") << "\n";
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…