제출 #624084

#제출 시각아이디문제언어결과실행 시간메모리
624084Ronin13Highway Tolls (IOI18_highway)C++14
51 / 100
288 ms35928 KiB
#include "highway.h"
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define f first
#define s second
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pb push_back
#define epb emplace_back
using namespace std;

const int NMAX = 1e6 + 1;

vector <vector <int> > g(NMAX);

int d[NMAX];
vector <int> p(NMAX, -1);
int n;
ll a, b;
void bfs(int s){
    d[s] = 0;
    for(int i = 0; i < n; i++){
        p[i] = -1;
        d[i] = 1e9;
    }
    queue <int> q;
    q.push(s);
    int cnt = 1;
    p[s] = 0;
    d[s] = 0;
    while(!q.empty()){
        int v = q.front();
        q.pop();
        for(int to : g[v]){
            if(p[to] != -1) continue;
            d[to] = cnt++;
            p[to] = v;
            q.push(to);
        }
    }
}



void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) {
    vector <int> bb;
    n = N;
    int m = U.size();
    for(int i = 0; i < m; i++){
        bb.pb(0);
        g[U[i]].pb(V[i]);
        g[V[i]].pb(U[i]);
    }
    a = A;
    b = B;
    const vector <int> vv = bb;
    ll mn = ask(bb);
    bfs(0);

    int l = 0, r = n;
    while(l + 1 < r){
        int mid = (l + r) / 2;
        vector <int> vec;
        for(int i = 0; i < m; i++){
            if(d[U[i]] <= mid && d[V[i]] <= mid)vec.pb(0);
            else vec.pb(1);
        }
        const vector <int> vv = vec;
        ll x = ask(vv);
        if(x == mn) r = mid;
        else l = mid;
    }
    for(int i = 0; i < n; i++) if(d[i] == r) {
        r = i;
        break;
    }
    bfs(r);
    int l1 = 0, r1 = n;
    while(l1 + 1 < r1){
        int mid = (l1 + r1) / 2;
        vector <int> vec;
        for(int i = 0; i < m; i++){
            if(d[U[i]] <= mid && d[V[i]] <= mid) vec.pb(0);
            else vec.pb(1);
        }
        const vector <int> vv = vec;
        ll x = ask(vv);
        if(x == mn) r1 = mid;
        else l1 = mid;
    }
    for(int i = 0; i < n; i++) if(d[i] == r1){
        r1 = i;
        break;
    }
    answer(r, r1);
}
#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...