| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 292403 | zoooma13 | 통행료 (IOI18_highway) | C++14 | 0 ms | 0 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "highway.h"
#include "grader.cpp"
using namespace std;
vector<vector <pair<int ,int>>> adj;
vector <pair<int ,int>> ver;
void dfs(int u ,int p=-1 ,int f=-1){
    for(auto&e : adj[u]) if(e.first != p)
        dfs(e.first ,u ,e.second);
    ver.push_back({u ,f});
}
void find_pair(int N, vector<int> U, vector<int> V, int A, int B) {
    int M = U.size();
    adj.resize(N);
    for(int i=0; i<M; i++){
        adj[U[i]].push_back({V[i] ,i});
        adj[V[i]].push_back({U[i] ,i});
    }
    long long emp = ask(vector<int>(M ,0));
    int st = 0 ,en = M-1 ,mid;
    while(st <= en){
        mid = (st+en)>>1;
        vector <int> t(mid+1 ,1);
        t.resize(M);
        if(ask(t) != emp)
            en = mid-1;
        else
            st = mid+1;
    }
    int root = U[st];
    vector <int> intree(M ,1);
    queue <int> q{{root}};
    vector <bool> vis(N); vis[root] = 1;
    vector <vector<pair<int ,int>>> newadj(N);
    while(!q.empty()){
        int u = q.front(); q.pop();
        for(auto&e : adj[u]) if(!vis[e.first]){
            q.push(e.first);
            vis[e.first] = 1;
            intree[e.second] = 0;
            newadj[u].push_back({e.first ,e.second});
            newadj[e.first].push_back({u ,e.second});
        }
    }
    swap(adj ,newadj);
    int S ,T;
    ver.clear() ,dfs(root) ,ver.pop_back();
    st = 0 ,en = N-1 ,mid;
    while(st <= en){
        mid = (st+en)>>1;
        vector <int> t = intree;
        for(int i=st; i<=mid; i++)
            t[ ver[i].second ] = 1;
        if(ask(t) != emp)
            en = mid-1;
        else
            st = mid+1;
    }
    S = ver[st].first;
    ver.clear() ,dfs(S) ,ver.pop_back();
    st = 0 ,en = N-1 ,mid;
    while(st <= en){
        mid = (st+en)>>1;
        vector <int> t = intree;
        for(int i=st; i<=mid; i++)
            t[ ver[i].second ] = 1;
        if(ask(t) != emp)
            en = mid-1;
        else
            st = mid+1;
    }
    T = ver[st].first;
    answer(S ,T);
}
