제출 #276010

#제출 시각아이디문제언어결과실행 시간메모리
276010dooweyHighway Tolls (IOI18_highway)C++14
100 / 100
383 ms13728 KiB
#include <bits/stdc++.h>
#include "highway.h"

using namespace std;

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

#define fi first
#define se second
#define mp make_pair

int n;
int m;

const int N = 130500;
int dis[2][N];
int par[2][N];

int c;
vector<pii> T[N];

void bfs(int u){
    dis[c][u]=0;
    par[c][u]=-1;
    queue<int> bf;
    bf.push(u);
    int node;
    while(!bf.empty()){
        node = bf.front();
        bf.pop();
        for(auto x : T[node]){
            if(dis[c][x.fi] > dis[c][node] + 1){
                dis[c][x.fi] = dis[c][node] + 1;
                par[c][x.fi] = x.se;
                bf.push(x.fi);
            }
        }
    }
    c ++ ;
}
struct Node{
    int dist;
    int parid;
    int ndx;
    bool operator<(const Node &F) const {
        return dist < F.dist;
    }
};


void find_pair(int _n, vector<int> u, vector<int> v, int a, int b) {
    n = _n;
    m = u.size();
    vector<int> w(m);
    for(int i = 0 ; i < m ; i ++ ){
        w[i] = 0;
        T[u[i]].push_back(mp(v[i], i));
        T[v[i]].push_back(mp(u[i], i));
    }
    ll dist = ask(w);
    int li = 0, ri = m-1;
    int mid;
    while(li < ri){
        mid = (li + ri) / 2;
        for(int j = 0 ; j < m ; j ++ ){
            if(j <= mid)
                w[j] = 0;
            else
                w[j] = 1;
        }
        if(ask(w) == dist)
            ri = mid;
        else
            li = mid + 1;
    }
    int p = u[li];
    int q = v[li];
    int man = li;
    for(int i = 0 ; i < 2; i ++ ){
        for(int j = 0 ; j < n; j ++ ){
            dis[i][j] = (int)1e9;
            par[i][j] = -1;
        }
    }
    bfs(p);
    bfs(q);
    vector<Node> cell[2];
    for(int i = 0 ; i < n; i ++ ){
        if(dis[0][i] == dis[1][i]){
            continue;
        }
        else if(dis[0][i] < dis[1][i]){
            cell[0].push_back({dis[0][i], par[0][i], i});
        }
        else{
            cell[1].push_back({dis[1][i], par[1][i], i});
        }
    }
    sort(cell[0].begin(), cell[0].end());
    sort(cell[1].begin(), cell[1].end());
    li = 0, ri = (int)cell[0].size() - 1;
    while(li < ri){
        mid = (li + ri) / 2;
        for(int i = 0 ; i < m ; i ++ ){
            w[i] = 1;
        }
        w[man] = 0;
        for(auto f : cell[1]){
            if(f.parid != -1){
                w[f.parid] = 0;
            }
        }
        for(int i = 0 ; i <= mid; i ++ ){
            if(cell[0][i].parid != -1)
                w[cell[0][i].parid] = 0;
        }
        if(ask(w) == dist)
            ri = mid;
        else
            li = mid + 1;
    }
    int S,T;
    S = cell[0][li].ndx;
    li = 0, ri = (int)cell[1].size() - 1;
    while(li < ri){
        mid = (li + ri) / 2;
        for(int i = 0 ; i < m; i ++ ){
            w[i] = 1;
        }
        w[man] = 0;
        for(auto f : cell[0]){
            if(f.parid != -1){
                w[f.parid] = 0;
            }
        }
        for(int i = 0 ; i <= mid; i ++ ){
            if(cell[1][i].parid != -1){
                w[cell[1][i].parid] = 0;
            }
        }
        if(ask(w) == dist)
            ri = mid;
        else
            li = mid + 1;
    }
    T = cell[1][li].ndx;
    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...