# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
784215 | APROHACK | Highway Tolls (IOI18_highway) | C++14 | 110 ms | 13304 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "highway.h"
#include <bits/stdc++.h>
#define ff first
#define ss second
#define ll long long
#define pb push_back
using namespace std;
int m, n;
vector<int>adj[100000];
vector<int>idx[100000];
vector<int>options;
vector<int>edjes;
bool vis[100000];
ll largo;
void bfs(int s){
memset(vis, false, sizeof vis);
int distancia[100000];
queue<int>cola;
distancia[0] = 0;
vis[0] = true;
cola.push(s);
while(!cola.empty()){
int cur = cola.front();
//cout << cur << endl;
cola.pop();
for(int i = 0 ; i < adj[cur].size() ; i ++){
if(vis[adj[cur][i]])continue;
vis[adj[cur][i]] = true;
distancia[adj[cur][i]] = distancia[cur] + 1;
if(distancia[adj[cur][i]] == largo){
options.pb(adj[cur][i]);
edjes.pb(idx[cur][i]);
}
cola.push(adj[cur][i]);
}
}
}
void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) {
m = U.size();
n = N;
bool val = true;
for(int i = 0 ; i < m ; i ++){
adj[U[i]].pb(V[i]);
adj[V[i]].pb(U[i]);
idx[U[i]].pb(i);
idx[V[i]].pb(i);
if(U[i] != i)val = false;
if(V[i] != i + 1)val = false;
}
vector<int>w;
for(int i = 0 ; i < m ; i ++)w.pb(0);
ll ans = ask(w);
largo = ans / A;
if(val){
int ansA, ansB;
int li = 0, ls = m-1, pos;
pos = (li + ls )/2;
while(li+1 < ls){
for(int i = 0 ; i < m ; i ++)w[i] = 0;
for(int i = pos ; i <= ls ; i ++){
w[i] = 1;
}
if(ask(w) > largo*A){
li = pos;
}else{
ls = pos -1;
}
pos = (li + ls)/2;
}
for(int i = 0 ; i < m ; i ++)w[i] = 0;
w[ls] = 1;
if(ask(w) > largo*A){
ansA = V[ls];
}else ansA = V[li];
li = 0, ls = m-1, pos;
pos = (li + ls )/2;
while(li+1 < ls){
for(int i = 0 ; i < m ; i ++)w[i] = 0;
for(int i = li ; i <= pos ; i ++){
w[i] = 1;
}
if(ask(w) > largo*A){
ls = pos;
}else{
li = pos +1;
}
pos = (li + ls)/2;
}
for(int i = 0 ; i < m ; i ++)w[i] = 0;
w[li] = 1;
if(ask(w) > largo*A){
ansB = U[li];
}else ansB = U[ls];
answer(ansA, ansB);
}else{
bfs(0);
int li = 0, ls = options.size()-1;
int pos = (li + ls)/2;
while(li + 1 < ls){
for(int i = 0 ; i < m ; i ++)w[i] = 0;
for(int i = pos ; i <= ls ; i ++)w[edjes[i]] = 1;
if(ask(w) > largo*A){
li = pos;
}else{
ls = pos -1;
}
pos = (li + ls )/2;
}
for(int i = 0 ; i < m ; i ++)w[i] = 0;
w[edjes[li]] = 1;
if(ask(w) > largo*A)answer(0, options[li]);
else answer(0, options[ls]);
}
}
컴파일 시 표준 에러 (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... |