제출 #1156424

#제출 시각아이디문제언어결과실행 시간메모리
1156424bobo통행료 (IOI18_highway)C++20
0 / 100
247 ms327680 KiB
#include "highway.h"
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

int timer = 0;
int tin[130001], pa[130001], id[130001];
int rv[130001];
vector<pair<int, int>> adj[130001];

void dfs(int u, int p) {
    tin[u] = ++timer;
    rv[timer] = u;
    // cout << "dfs: " << u << '\n';
    for (auto& [v, eid] : adj[u]) {
        if (v == p) continue;
        pa[v] = u, id[v] = eid;
        dfs(v, u);
    }
}

void find_pair(int n, std::vector<int> u, std::vector<int> v, int A, int B) {
    int m = u.size();
    vector<int> w(m, 0);
    ll dist = ask(w) / A;
    for (int i = 0; i < m; i++) {
        adj[u[i]].push_back({v[i], i});
        adj[v[i]].push_back({u[i], i});
    }
    pa[0] = 0;
    dfs(0, -1);
    // answer(0, n - 1);
    int l = 1, r = n;
    while (l < r) {
        int mid = (l + r) / 2;
        w = vector<int>(m, 0);
        for (int i = 1; i <= mid; i++) {
            int node = rv[i];
            if (node != 0) w[id[node]] = 1;
        }
        ll res = ask(w);
        if (1LL * B * dist == res) r = mid;
        else l = mid + 1;
    }
    int T = rv[l];
    l = 1, r = n;
    while (l < r) {
        int mid = (l + r + 1) / 2;
        w = vector<int>(m, 0);
        for (int i = mid; i <= n; i++) {
            int node = rv[i];
            if (node != 0) w[id[node]] = 1;
        }
        ll res = ask(w);
        if (1LL * B * dist == res) l = mid;
        else r = mid - 1;
    }
    int S = rv[l];
    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...