Submission #155695

# Submission time Handle Problem Language Result Execution time Memory
155695 2019-09-29T23:38:11 Z rama_pang Highway Tolls (IOI18_highway) C++14
0 / 100
392 ms 262148 KB
#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];
int S, T;
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);
    }
    vector<int> guess(M, 0);
    lint D = ask(guess) / A;
    lint le, ri, ans, check;

    /* find and edge e = uv, then construct tree rooted from u and from v */

    le = 0, ri = M - 1;
    while (le <= ri) {
        lint mid = (le + ri) / 2;
        guess.assign(M, 0);
        for (int i = 0; i <= mid; i++) guess[i] = 1;
        check = ask(guess);
        if (check > D * A) {
            ans = mid;
            ri = mid - 1;                
        } else {
            le = mid + 1;
        }
    }
    int root1 = E[ans].u, root2 = E[ans].v;


    /* binary search from to find the opther pair */
    for (int i = 0; i < N; i++) dist[i] = 1e7;
    dfs(root1, root2, 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());
    le = 0, ri = M - 1;
    ans = (dist[E.back().u] > dist[E.back().v])? E.back().u : E.back().v;
    while (le <= ri) {
        guess.assign(M, 0);
        lint mid = (le + ri) / 2;
        for (int i = 0; i <= mid; i++) guess[E[i].id] = 1;
        check = ask(guess);
        if (check > D * A) {
            ans = mid;
            ri = mid - 1;
        } else {
            le = mid + 1;
        }
    }
    ans = (dist[E[ans].u] == D)? E[ans].u : E[ans].v;
    S = ans;
    /* found one pair, now find the other one */

    for (int i = 0; i < N; i++) dist[i] = 1e7;
    dfs(S, -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());
    le = 0, ri = M - 1;
    ans = (dist[E.back().u] > dist[E.back().v])? E.back().u : E.back().v;
    while (le <= ri) {
        guess.assign(M, 0);
        lint mid = (le + ri) / 2;
        for (int i = 0; i <= mid; i++) guess[E[i].id] = 1;
        check = ask(guess);
        if (check == D * B) {
            ans = mid;
            ri = mid - 1;
        } else {
            le = mid + 1;
        }
    }
    ans = (dist[E[ans].u] == D)? E[ans].u : E[ans].v;
    T = ans;
    /* found one pair, now find the other one */
    
    cout << S  << " " << T << "\n";
    answer(S, T);
}

/*

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 1 3
0 1
0 3
1 2


*/

Compilation message

highway.cpp: In function 'void find_pair(int, std::vector<int>, std::vector<int>, int, int)':
highway.cpp:54:22: warning: 'ans' may be used uninitialized in this function [-Wmaybe-uninitialized]
     int root1 = E[ans].u, root2 = E[ans].v;
                      ^
# Verdict Execution time Memory Grader output
1 Incorrect 6 ms 3876 KB DO NOT PRINT ANYTHING TO STANDARD OUTPUT
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 7 ms 3832 KB DO NOT PRINT ANYTHING TO STANDARD OUTPUT
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 25 ms 5068 KB DO NOT PRINT ANYTHING TO STANDARD OUTPUT
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 6 ms 3832 KB DO NOT PRINT ANYTHING TO STANDARD OUTPUT
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 392 ms 262148 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 311 ms 262148 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -