제출 #1327788

#제출 시각아이디문제언어결과실행 시간메모리
1327788shirokuma5Prize (CEOI22_prize)C++20
10 / 100
1616 ms439220 KiB
#include<bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)n; i++)
#define rep1(i, n) for (int i = 1; i <= (int)(n); i++)

vector<vector<int>> G1, G2;
int N, K, Q, T, r1, r2;

int dep1[1000009], dep2[1000009], par1[30][1000009], par2[30][1000009];
vector<int> sorted;

void dfs1(int now) {
    sorted.push_back(now);
    for (int nex : G1[now]) {
        dep1[nex] = dep1[now] + 1; par1[0][nex] = now; dfs1(nex);
    }
}
void dfs2(int now) {
    for (int nex : G2[now]) {
        dep2[nex] = dep2[now] + 1; par2[0][nex] = now; dfs2(nex);
    }
}
int prevs1(int pos, int d) {
    rep(i, 30) if ((d >> i) & 1) pos = par1[i][pos];
    return pos;
}
int prevs2(int pos, int d) {
    rep(i, 30) if ((d >> i) & 1) pos = par2[i][pos];
    return pos;
}
int lca1(int u, int v) {
    if (dep1[u] > dep1[v]) swap(u, v);
    v = prevs1(v, dep1[v] - dep1[u]);
    if (u == v) return u;
    for (int i = 29; i >= 0; i--) {
        if (par1[i][u] != par1[i][v]) {
            u = par1[i][u]; v = par1[i][v];
        }
    }
    return par1[0][u];
}
int lca2(int u, int v) {
    if (dep2[u] > dep2[v]) swap(u, v);
    v = prevs2(v, dep2[v] - dep2[u]);
    if (u == v) return u;
    for (int i = 29; i >= 0; i--) {
        if (par2[i][u] != par2[i][v]) {
            u = par2[i][u]; v = par2[i][v];
        }
    }
    return par2[0][u];
}

int main() {
    cin >> N >> K >> Q >> T;
    G1.resize(N+1); G2.resize(N+1);
    rep1(i, N) {
        int p; cin >> p;
        if (p == -1) {
            r1 = i; dep1[r1] = 0;
        }
        else G1[p].push_back(i);
    }
    rep1(i, N) {
        int p; cin >> p;
        if (p == -1) {
            r2 = i; dep2[r2] = 0;
        }
        else G2[p].push_back(i);
    }

    dfs1(r1); dfs2(r2);
    // ダブリング
    rep(i, 29) rep1(j, N) {
        par1[i+1][j] = par1[i][par1[i][j]];
        par2[i+1][j] = par2[i][par2[i][j]];
    }

    // 質疑応答
    rep(i, K) {
        cout << sorted[i];
        if (i == K - 1) cout << endl;
        else cout << " ";
    }
    rep1(i, K-1) {
        cout << "? " << r1 << " " << sorted[i] << endl;
    }
    cout << "!" << endl;
    vector<int> d(N+1, 0), ans(T);
    rep1(i, K-1) {
        int a, b, c; cin >> a >> d[sorted[i]] >> b >> c;
    }
    rep(i, T) {
        int p, q; cin >> p >> q;
        ans[i] = d[p] + d[q] - d[lca1(p, q)] * 2;
    }
    rep(i, T) cout << ans[i] << " " << ans[i] << endl;

}
#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...