제출 #971769

#제출 시각아이디문제언어결과실행 시간메모리
971769fve5Highway Tolls (IOI18_highway)C++17
51 / 100
140 ms11544 KiB
#include <bits/stdc++.h>
#include "highway.h"
using namespace std;

void find_pair(int N, vector<int> U, vector<int> V, int A, int B) {
    int M = U.size();
    assert(M + 1 == N);

    vector<vector<pair<int, int>>> adj(N);
    for (int i = 0; i < M; i++) {
        adj[U[i]].emplace_back(V[i], i);
        adj[V[i]].emplace_back(U[i], i);
    }

    vector<pair<int, int>> dfs_order;
    auto dfs = [&](auto &&dfs, int node, int par) -> void {
        for (auto [x, idx]: adj[node]) {
            if (x == par) continue;
            dfs_order.emplace_back(x, idx);
            dfs(dfs, x, node);
        }
    };

    long long base_cost = ask(vector<int>(M));

    int S, T;

    { // Get S
        dfs_order.clear();
        dfs(dfs, 0, -1);

        int l = 0, r = N;
        while (l + 1 < r) {
            int m = (l + r) / 2;

            vector<int> query(M);
            for (int i = 0; i < m; i++) query[dfs_order[i].second] = 1;

            if (ask(query) == base_cost / A * B) r = m;
            else l = m;
        }

        S = dfs_order[r - 1].first;
    }

    { // Get T
        dfs_order.clear();
        dfs(dfs, S, -1);

        int l = 0, r = N;
        while (l + 1 < r) {
            int m = (l + r) / 2;

            vector<int> query(M);
            for (int i = 0; i < m; i++) query[dfs_order[i].second] = 1;

            if (ask(query) == base_cost / A * B) r = m;
            else l = m;
        }

        T = dfs_order[r - 1].first;
    }

    answer(S, T);
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...