답안 #121510

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
121510 2019-06-26T15:35:54 Z Sorting 통행료 (IOI18_highway) C++14
51 / 100
379 ms 16928 KB
#include <bits/stdc++.h>
#include "highway.h"
 
using namespace std;
 
const long long MAXN = 1e5 + 7;
 
long long ask(const vector<int> &w);
void answer(int s, int t);
 
mt19937 mt();
 
long long n, m;
vector<int> adj[MAXN], idx[MAXN], w;
bool used[MAXN];

long long a, b;
long long sm;

stack<long long> q;

vector<pair<long long, long long> > bfs(long long x){
	for(long long i = 0; i < n; i++){
		used[i] = false;
	}
 
	q.push(x);
	
	vector<pair<long long, long long> > v;
 
	while(!q.empty()){
		long long u = q.top();
		q.pop();
 
		if(used[u]){
			continue;
		}
		used[u] = true;
 
		for(long long i = 0; i < adj[u].size(); i++){
			long long to = adj[u][i];
			long long j = idx[u][i];
 
			if(!used[to]){
				q.push(to);
				v.push_back({j, to});
			}
		}
	}
 
	return v;
}

long long away(int x, const vector<int> &U, const vector<int> &V){
	vector<pair<long long, long long> > v = bfs(x);
 
	while((long long)v.size() != m);

	long long l = 0, r = (long long)v.size() - 1;
 
	while(l != r){
		long long mid = (l + r) >> 1;
		 
		for(long long i = 0; i < m; i++){
			w[i] = 0;
		}

		for(long long i = 0; i <= mid; i++){
			w[ v[i].first ] = 1;
		}

		long long score = ask(w); 

		if(score == (sm / a) * b){
			r = mid;
		}
		else{
			l = mid + 1;
		}
	}

	return v[l].second;
}
 
void find_pair(int N, vector<int> U, vector<int> V, int A, int B){
	srand(time(NULL));

	n = N;
	m = U.size();
 
	for(long long i = 0; i < m; i++){
		adj[V[i]].push_back(U[i]);
		adj[U[i]].push_back(V[i]);
 
		idx[V[i]].push_back(i);
		idx[U[i]].push_back(i);
		w.push_back(0);
	}
 
	sm = ask(w);
	a = A;
	b = B;
 
	long long l = 0, r = m - 1;
 
	while(l != r){
		long long mid = (l + r) / 2;
 
		for(long long i = 0; i < m; i++){
			w[i] = 0; 
		}
		for(long long i = mid + 1; i <= r; i++){
			w[i] = 1;
		}
 
		long long score = ask(w);
		score -= sm;
 
		if(score){
			l = mid + 1;
		}
		else{
			r = mid;
		}
	}
 
	long long x, y;
 
	x = away(U[l], U, V);
 
	y = away(x, U, V);
 
	answer(x, y);
}
/*
9 1 2
4 8
4 2
8 0
2 5
2 7
2 3
0 1
0 6
*/

Compilation message

highway.cpp: In function 'std::vector<std::pair<long long int, long long int> > bfs(long long int)':
highway.cpp:40:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(long long i = 0; i < adj[u].size(); i++){
                        ~~^~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 4984 KB Output is correct
2 Correct 6 ms 4984 KB Output is correct
3 Correct 7 ms 4984 KB Output is correct
4 Correct 7 ms 4984 KB Output is correct
5 Correct 6 ms 5028 KB Output is correct
6 Correct 7 ms 4984 KB Output is correct
7 Correct 6 ms 4984 KB Output is correct
8 Correct 6 ms 5116 KB Output is correct
9 Correct 6 ms 5024 KB Output is correct
10 Correct 6 ms 5020 KB Output is correct
11 Correct 6 ms 4984 KB Output is correct
12 Correct 6 ms 5032 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 5112 KB Output is correct
2 Correct 26 ms 6264 KB Output is correct
3 Correct 235 ms 16120 KB Output is correct
4 Correct 281 ms 16192 KB Output is correct
5 Correct 274 ms 16188 KB Output is correct
6 Correct 256 ms 16200 KB Output is correct
7 Correct 267 ms 16304 KB Output is correct
8 Correct 266 ms 16192 KB Output is correct
9 Correct 261 ms 16216 KB Output is correct
10 Correct 255 ms 16192 KB Output is correct
11 Correct 262 ms 15992 KB Output is correct
12 Correct 268 ms 16008 KB Output is correct
13 Correct 334 ms 15996 KB Output is correct
14 Correct 317 ms 16104 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 6360 KB Output is correct
2 Correct 46 ms 7484 KB Output is correct
3 Correct 68 ms 8472 KB Output is correct
4 Correct 196 ms 15992 KB Output is correct
5 Correct 180 ms 15992 KB Output is correct
6 Correct 147 ms 15992 KB Output is correct
7 Correct 170 ms 15992 KB Output is correct
8 Correct 177 ms 16008 KB Output is correct
9 Correct 212 ms 15984 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 5096 KB Output is correct
2 Correct 32 ms 6272 KB Output is correct
3 Correct 228 ms 14188 KB Output is correct
4 Correct 222 ms 16204 KB Output is correct
5 Correct 225 ms 16188 KB Output is correct
6 Correct 247 ms 16192 KB Output is correct
7 Correct 232 ms 16188 KB Output is correct
8 Correct 234 ms 16180 KB Output is correct
9 Correct 272 ms 16224 KB Output is correct
10 Correct 240 ms 16296 KB Output is correct
11 Correct 243 ms 16008 KB Output is correct
12 Correct 259 ms 16004 KB Output is correct
13 Correct 275 ms 15992 KB Output is correct
14 Correct 285 ms 16076 KB Output is correct
15 Correct 260 ms 16200 KB Output is correct
16 Correct 196 ms 16252 KB Output is correct
17 Correct 297 ms 15996 KB Output is correct
18 Correct 286 ms 15996 KB Output is correct
19 Correct 221 ms 16200 KB Output is correct
20 Correct 259 ms 16004 KB Output is correct
21 Correct 249 ms 16928 KB Output is correct
22 Correct 216 ms 16928 KB Output is correct
23 Correct 257 ms 16812 KB Output is correct
24 Correct 209 ms 16748 KB Output is correct
25 Correct 379 ms 16096 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 43 ms 6352 KB Output is incorrect: {s, t} is wrong.
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 31 ms 6312 KB Output is incorrect: {s, t} is wrong.
2 Halted 0 ms 0 KB -