제출 #715455

#제출 시각아이디문제언어결과실행 시간메모리
715455Sorting통행료 (IOI18_highway)C++17
90 / 100
235 ms10948 KiB
#include "highway.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 1e5 + 3;

ll n, a, b, m, dist;
vector<pair<int, int>> adj[N];

int get_last(int start){
    queue<int> q;
    q.push(start);

    vector<bool> vis(n, false);
    vis[start] = true;

    vector<pair<int, int>> edges;

    while(!q.empty()){
        int u = q.front();
        q.pop();

        for(auto [to, idx]: adj[u]){
            if(vis[to]) continue;
            edges.push_back({to, idx});
            q.push(to);
            vis[to] = true;
        }
    }

    int l = 0, r = n - 1;
    while(l != r){
        int mid = (l + r) >> 1;
        vector<int> w(m, 1);
        for(int i = 0; i <= mid; ++i)
            w[edges[i].second] = 0;
        if(ask(w) == dist)
            r = mid;
        else
            l = mid + 1;
    }

    return edges[l].first;
}

void find_pair(int _n, std::vector<int> u, std::vector<int> v, int _a, int _b) {
    m = u.size();
    n = _n, a = _a, b = _b;

    for(int i = 0; i < m; ++i){
        adj[u[i]].push_back({v[i], i});
        adj[v[i]].push_back({u[i], i});
    }

    dist = ask(vector<int>(m, 0));

    int l = 0, r = m - 1;
    while(l != r){
        int mid = (l + r) >> 1;
        vector<int> w(m, 1);
        for(int i = 0; i <= mid; ++i)
            w[i] = 0;
        if(ask(w) == dist)
            r = mid;
        else
            l = mid + 1;
    }

    int x = u[l];
    int s = get_last(x);
    int t = get_last(s);

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