제출 #155693

#제출 시각아이디문제언어결과실행 시간메모리
155693rama_pang통행료 (IOI18_highway)C++14
12 / 100
468 ms262148 KiB
    #include "highway.h"
    #include <bits/stdc++.h>
    using namespace std;
    using lint = long long;
    const lint MAXN = 150005;
 
    lint N, M, A, B;
    vector<int> G[MAXN];
    lint dist[MAXN];
    struct edge {
        int u, v, id;
        edge(int uu, int vv, int idd): u(uu), v(vv), id(idd) { }
        bool operator < (const edge &o) {
            return dist[v] < dist[o.v] || (dist[v] == dist[o.v] && v < o.v);
        }
    };
 
    vector<edge> E;
 
    void dfs(int n, int p, int d) {
        dist[n] = d;
        for (auto &i : G[n]) if (i != p) {
            dfs(i, n, d + 1);
        }
    }
 
    void find_pair(int _N, vector<int> U, vector<int> V, int _A, int _B) {
        N = _N, A = _A, B = _B, M = U.size();
        for (int i = 0; i < M; i++) {
            G[U[i]].emplace_back(V[i]);
            G[V[i]].emplace_back(U[i]);
            E.emplace_back(U[i], V[i], i);
        }
        dfs(0, -1, 0);
        for (int i = 0; i < M; i++) {
            if (dist[E[i].u] > dist[E[i].v]) swap(E[i].u, E[i].v);
        }
        sort(E.begin(), E.end());
        lint le = 0, ri = M - 1;
        lint ans = (dist[E.back().u] > dist[E.back().v])? E.back().u : E.back().v;
        vector<int> guess(M, 0);
        lint D = ask(guess) / A;
        while (le <= ri) {
            guess.assign(M, 0);
            lint mid = (le + ri) / 2;
            for (int i = 0; i <= mid; i++) guess[E[i].id] = 1;
            lint check = ask(guess);
            // cout << le << " " << ri << " " << check << "\n";
            if (check == D * B) {
                ans = mid;
                ri = mid - 1;
            } else {
                // ans = mid;
                le = mid + 1;
            }
        }
        // cout << ans << "\n";
        ans = (dist[E[ans].u] == D)? E[ans].u : E[ans].v;
        answer(0, ans);
    }
 
    /*
 
    4 4 1 3 1 3
    0 1
    0 2
    0 3
    1 2
 
    4 3 1 3 0 2
    0 1
    0 2
    0 3
 
    4 3 1 3 0 1
    0 1
    0 3
    1 2
 
 
    */
#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...