답안 #121517

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
121517 2019-06-26T16:04:51 Z Sorting 통행료 (IOI18_highway) C++14
51 / 100
406 ms 16960 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(3);
 
long long n, m;
vector<int> adj[MAXN], idx[MAXN], w;
bool used[MAXN];

long long a, b;
long long sm;

queue<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.front();
		q.pop();
 
		if(used[u]){
			continue;
		}
		used[u] = true;

		for(int i = 0; i < adj[u].size(); i++){
			int x = mt() % adj[u].size();
			int y = mt() % adj[u].size();

			swap(adj[u][x], adj[u][y]);
			swap(idx[u][x], idx[u][y]);
		}
 
		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:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < adj[u].size(); i++){
                  ~~^~~~~~~~~~~~~~~
highway.cpp:48: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 7 ms 5032 KB Output is correct
2 Correct 7 ms 5032 KB Output is correct
3 Correct 7 ms 4984 KB Output is correct
4 Correct 7 ms 5032 KB Output is correct
5 Correct 7 ms 5092 KB Output is correct
6 Correct 6 ms 4984 KB Output is correct
7 Correct 6 ms 5044 KB Output is correct
8 Correct 6 ms 4984 KB Output is correct
9 Correct 7 ms 5032 KB Output is correct
10 Correct 7 ms 4984 KB Output is correct
11 Correct 6 ms 5028 KB Output is correct
12 Correct 6 ms 4984 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 5184 KB Output is correct
2 Correct 35 ms 6280 KB Output is correct
3 Correct 326 ms 16232 KB Output is correct
4 Correct 394 ms 16368 KB Output is correct
5 Correct 320 ms 16224 KB Output is correct
6 Correct 281 ms 16280 KB Output is correct
7 Correct 406 ms 16228 KB Output is correct
8 Correct 296 ms 16248 KB Output is correct
9 Correct 304 ms 16224 KB Output is correct
10 Correct 280 ms 16208 KB Output is correct
11 Correct 276 ms 16108 KB Output is correct
12 Correct 298 ms 16000 KB Output is correct
13 Correct 313 ms 16096 KB Output is correct
14 Correct 305 ms 16036 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 6204 KB Output is correct
2 Correct 74 ms 7520 KB Output is correct
3 Correct 70 ms 8440 KB Output is correct
4 Correct 183 ms 16012 KB Output is correct
5 Correct 176 ms 15988 KB Output is correct
6 Correct 179 ms 16100 KB Output is correct
7 Correct 203 ms 15984 KB Output is correct
8 Correct 184 ms 15996 KB Output is correct
9 Correct 198 ms 16000 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 5116 KB Output is correct
2 Correct 30 ms 6268 KB Output is correct
3 Correct 210 ms 14220 KB Output is correct
4 Correct 277 ms 16228 KB Output is correct
5 Correct 290 ms 16212 KB Output is correct
6 Correct 301 ms 16224 KB Output is correct
7 Correct 282 ms 16184 KB Output is correct
8 Correct 290 ms 16216 KB Output is correct
9 Correct 292 ms 16224 KB Output is correct
10 Correct 322 ms 16240 KB Output is correct
11 Correct 317 ms 16004 KB Output is correct
12 Correct 298 ms 16016 KB Output is correct
13 Correct 281 ms 16008 KB Output is correct
14 Correct 315 ms 16116 KB Output is correct
15 Correct 296 ms 16220 KB Output is correct
16 Correct 260 ms 16224 KB Output is correct
17 Correct 312 ms 16020 KB Output is correct
18 Correct 308 ms 16092 KB Output is correct
19 Correct 283 ms 16236 KB Output is correct
20 Correct 294 ms 16108 KB Output is correct
21 Correct 264 ms 16936 KB Output is correct
22 Correct 267 ms 16960 KB Output is correct
23 Correct 289 ms 16944 KB Output is correct
24 Correct 290 ms 16740 KB Output is correct
25 Correct 299 ms 16120 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 6356 KB Output is correct
2 Incorrect 36 ms 6384 KB Output is incorrect: {s, t} is wrong.
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 31 ms 6316 KB Output is incorrect: {s, t} is wrong.
2 Halted 0 ms 0 KB -