# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
333429 | SHZhang | Highway Tolls (IOI18_highway) | C++14 | 315 ms | 12840 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <cstdio>
#include <utility>
#include <vector>
#include <queue>
#include "highway.h"
using namespace std;
#define ll long long
vector<pair<int, int> > graph[150000];
int n, m; ll mindis;
void bfs(int node, vector<pair<int, int> >& seq)
{
queue<int> que; que.push(node);
vector<int> dist(n);
for (int i = 0; i < n; i++) dist[i] = 100000000;
dist[node] = 0;
seq.push_back(make_pair(node, -1));
while (!que.empty()) {
int cur = que.front(); que.pop();
for (int i = 0; i < graph[cur].size(); i++) {
int nxt = graph[cur][i].first;
if (dist[cur] + 1 < dist[nxt]) {
dist[nxt] = dist[cur] + 1;
que.push(nxt); seq.push_back(make_pair(nxt, graph[cur][i].second));
}
}
}
}
int binary_search(vector<pair<int, int> >& seq)
{
int l = 0; int r = n - 1;
while (l < r) {
vector<int> wt(m);
for (int i = 0; i < m; i++) wt[i] = 1;
int mid = (l + r) / 2;
for (int i = 1; i <= mid; i++) {
wt[seq[i].second] = 0;
}
ll dis = ask(wt);
if (dis == mindis) {
r = mid;
} else {
l = mid + 1;
}
}
return seq[l].first;
}
void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) {
n = N; m = U.size();
for (int i = 0; i < m; i++) {
graph[U[i]].push_back(make_pair(V[i], i));
graph[V[i]].push_back(make_pair(U[i], i));
}
int l = 0; int r = n - 1;
vector<int> wt(m);
for (int i = 0; i < m; i++) wt[i] = 0;
mindis = ask(wt);
//fprintf(stderr, "here1");
while (l < r) {
vector<int> wt(m);
for (int i = 0; i < m; i++) wt[i] = 0;
int mid = (l + r) / 2;
for (int i = 0; i <= mid; i++) {
for (int j = 0; j < graph[i].size(); j++) {
wt[graph[i][j].second] = 1;
}
}
ll dis = ask(wt);
if (dis == mindis) {
l = mid + 1;
} else {
r = mid;
}
}
//fprintf(stderr, "here");
int midnode = l;
vector<pair<int, int> > seq; bfs(midnode, seq);
int S = binary_search(seq);
seq.clear();
bfs(S, seq);
int T = binary_search(seq);
answer(S, T);
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |