제출 #355926

#제출 시각아이디문제언어결과실행 시간메모리
355926talant117408통행료 (IOI18_highway)C++17
0 / 100
18 ms1516 KiB
#include "highway.h"
#include <bits/stdc++.h>
#ifndef EVAL
#include "grader.cpp"
#endif

using namespace std;

typedef long long ll;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;

#define precision(n) fixed << setprecision(n)
#define pb push_back
#define ub upper_bound
#define lb lower_bound
#define mp make_pair
#define eps (double)1e-9
#define PI 2*acos(0.0)
#define endl "\n"
#define sz(v) int((v).size())
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define do_not_disturb ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define OK cout << "OK" << endl;

vector <vector <pii>> g;
int n, m;
ll len;

void find_pair(int N, vector <int> U, vector<int> V, int light, int heavy){
    n = N; m = sz(U);
    g.resize(n);
    for(int i = 0; i < m; i++){
        g[U[i]].pb(mp(V[i], i));
        g[V[i]].pb(mp(U[i], i));
    }
    
    vector <ll> dist(n);
    vector <int> q(m), edges;
    queue <int> K;
    
    len = ask(q)/light;
    for(auto &to : dist) to = 1e18;
    
    dist[0] = 0;
    K.push(0);
    while(!K.empty()){
        auto v = K.front(); K.pop();
        for(auto to : g[v]){
            if(dist[to.first] > dist[v]+1){
                dist[to.first] = dist[v]+1;
                K.push(to.first);
                edges.pb(to.second);
            }
        }
    }
    
    for(auto &to : q) to = 1;
    
    int s, t;
    int l = 0, r = sz(edges)-1;
    int mn = 2e9;
    while(l <= r){
        int mid = (l+r) >> 1;
        for(int i = mid+1; i <= r; i++) q[edges[i]] = 0;
        auto ans = ask(q);
        for(int i = mid+1; i <= r; i++) q[edges[i]] = 1;
        if(ans%heavy == 0 && ans/heavy == len){
            mn = min(mn, mid);
            r = mid-1;
        }
        else{
            l = mid+1;
        }
    }
    
    auto rebro = edges[mn];
    
    if(dist[U[rebro]] > dist[V[rebro]]){
        s = U[rebro];
    }
    else{
        s = V[rebro];
    }
    
    edges.clear();
    for(auto &to : dist) to = 1e18;
    
    dist[s] = 0;
    K.push(s);
    while(!K.empty()){
        auto v = K.front(); K.pop();
        for(auto to : g[v]){
            if(dist[to.first] > dist[v]+1){
                dist[to.first] = dist[v]+1;
                K.push(to.first);
                edges.pb(to.second);
            }
        }
    }
    
    for(auto &to : q) to = 1;
    
    l = 0; r = sz(edges)-1;
    mn = 2e9;
    while(l <= r){
        int mid = (l+r) >> 1;
        for(int i = mid+1; i <= r; i++) q[edges[i]] = 0;
        auto ans = ask(q);
        for(int i = mid+1; i <= r; i++) q[edges[i]] = 1;
        if(ans%heavy == 0 && ans/heavy == len){
            mn = min(mn, mid);
            r = mid-1;
        }
        else{
            l = mid+1;
        }
    }
    
    
    rebro = edges[mn];
    if(dist[U[rebro]] > dist[V[rebro]]){
        t = U[rebro];
    }
    else{
        t = V[rebro];
    }
    answer(s, t);
}
/*
4 3
7 13
0 3
0 1
1 2
2 3
*/
#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...