답안 #75107

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
75107 2018-09-08T11:31:03 Z imeimi2000 통행료 (IOI18_highway) C++17
0 / 100
30 ms 6128 KB
#include "highway.h"
#include <queue>
#include <algorithm>

using namespace std;
typedef long long llong;

int n, m;
vector<int> edge[90000];
int dist1[90000];
int dist2[90000];

void bfs(int dist[], int S) {
    for (int i = 0; i < n; ++i) dist[i] = n;
    queue<int> q;
    dist[S] = 0;
    q.push(S);
    while (!q.empty()) {
        int x = q.front();
        q.pop();
        for (int i : edge[x]) {
            if (dist[i] < n) continue;
            dist[i] = dist[x] + 1;
            q.push(i);
        }
    }
}

int ch[90000];
void find_pair(int N, vector<int> U, vector<int> V, int A, int B) {
    n = N;
    m = U.size();
    llong d;
    {
        vector<int> q(m, 0);
        d = ask(q);
    }
    
    int L, R;
    {
        int s = 0, e = m - 1;
        while (s < e) {
            int md = (s + e) / 2;
            vector<int> q(m, 0);
            for (int i = 0; i <= md; ++i) q[i] = 1;
            if (ask(q) != d) e = md;
            else s = md + 1;
        }
        L = U[s];
        R = V[s];
    }
    
    for (int i = 0; i < m; ++i) {
        edge[U[i]].push_back(V[i]);
        edge[V[i]].push_back(U[i]);
    }
    
    bfs(dist1, L); bfs(dist2, R);
    vector<int> LP, RP;
    for (int i = 0; i < n; ++i) {
        if (dist1[i] < dist2[i]) LP.push_back(i);
        if (dist1[i] > dist2[i]) RP.push_back(i);
    }
    
    sort(LP.begin(), LP.end(), [&](int i, int j) {
        return dist1[i] > dist1[j];
    });
    
    sort(RP.begin(), RP.end(), [&](int i, int j) {
        return dist2[i] > dist2[j];
    });
    
    {
        int s = 0, e = LP.size() - 1;
        while (s < e) {
            int md = (s + e) / 2;
            vector<int> q(m);
            for (int i = 0; i < n; ++i) ch[i] = 0;
            for (int i = 0; i <= md; ++i) ch[LP[i]] = 1;
            for (int i = 0; i < m; ++i) q[i] = ch[U[i]] ^ ch[V[i]];
            if (ask(q) != d) e = md;
            else s = md + 1;
        }
        L = LP[s];
    }
    
    {
        int s = 0, e = LP.size() - 1;
        while (s < e) {
            int md = (s + e) / 2;
            vector<int> q(m);
            for (int i = 0; i < n; ++i) ch[i] = 0;
            for (int i = 0; i <= md; ++i) ch[RP[i]] = 1;
            for (int i = 0; i < m; ++i) q[i] = ch[U[i]] ^ ch[V[i]];
            if (ask(q) != d) e = md;
            else s = md + 1;
        }
        R = RP[s];
    }
    answer(L, R);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2512 KB Output is correct
2 Incorrect 4 ms 2424 KB Output is incorrect: {s, t} is wrong.
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 2448 KB Output is incorrect: {s, t} is wrong.
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 22 ms 3064 KB Output is incorrect: {s, t} is wrong.
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 8 ms 4856 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 27 ms 3152 KB Output is incorrect: {s, t} is wrong.
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 30 ms 6128 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -