답안 #815803

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
815803 2023-08-08T23:48:26 Z Lobo 통행료 (IOI18_highway) C++17
51 / 100
169 ms 18012 KB
#include "highway.h"
#include<bits/stdc++.h>
using namespace std;
#define fr first
#define sc second
#define mp make_pair
#define pb push_back
#define all(x) x.begin(),x.end()
#define int long long
const int inf = 1e18+10;
const int maxn = 9e4+10;

int n, m, par[maxn];
vector<int> parid[maxn];
vector<int> g[maxn];

void find_pair(int32_t N, std::vector<int32_t> U, std::vector<int32_t> V, int32_t A, int32_t B) {
	n = N;
	m = U.size();
	for(int i = 0; i < m; i++) {
		g[U[i]].pb(i);
		g[V[i]].pb(i);
	}
	vector<int32_t> vectudoa(m,0);
	int tudoa = ask(vectudoa);
	int path = tudoa/A;

	int edgein = -1;
	int lbs,rbs;
	vector<int32_t> vectoll(m,0);
	lbs = 0;
	rbs = m-1;
	while(lbs <= rbs) {
		int mid = (lbs+rbs)/2;
		vectoll.clear(); vectoll.resize(m,0);
		for(int i = 0; i <= mid; i++) {
			vectoll[i] = 1;
		}

		int toll = ask(vectoll);

		if(toll != tudoa) {
			edgein = mid;
			rbs = mid-1;
		}
		else {
			lbs = mid+1;
		}
	}

	assert(edgein != -1);

	int ss = U[edgein];
	int tt = V[edgein];

	vector<pair<int,int>> d(n+10,mp(inf,0));
	d[ss] = mp(0,ss); par[ss] = -1;
	d[tt] = mp(0,tt); par[tt] = -1;

	queue<int> q; q.push(ss); q.push(tt);
	while(q.size()) {
		int u = q.front(); q.pop();

		for(auto id : g[u]) {
			int v = U[id]+V[id]-u;
			if(d[v].fr > d[u].fr+1) {
				d[v] = mp(d[u].fr+1,d[u].sc);
				par[v] = u;
				parid[v].clear(); parid[v].pb(id);
				q.push(v);
			}
			else if(d[v].fr == d[u].fr+1 && d[v].sc != d[u].sc) {
				d[v].sc = -1;
			}
			else if(d[v].fr == d[u].fr+1) {
				parid[v].pb(id);
			}
		}
	}

	int toll0;

	vector<pair<int,int>> Ds;
	for(int i = 0; i < n; i++) {
		if(d[i].sc == ss) {
			Ds.pb(mp(d[i].fr,i));
		}
	}
	sort(all(Ds));
	lbs = 0;
	rbs = (int) Ds.size()-1;
	int32_t s = ss;

	vectoll.clear(); vectoll.resize(m,1);
	for(int i = 0; i < (int) Ds.size(); i++) {
		for(auto id : parid[Ds[i].sc]) vectoll[id] = 0;
		// if(parid[Ds[i].sc] != -1) vectoll[parid[Ds[i].sc]] = 1;
	}
	toll0 = ask(vectoll);

	while(lbs <= rbs) {
		int mid = (lbs+rbs)/2;

		vectoll.clear(); vectoll.resize(m,0);

		// for(int i = 0; i <= mid; i++) {
		// 	if(parid[Ds[i].sc] != -1) vectoll[parid[Ds[i].sc]] = 0;
		// }

		for(int i = mid; i < (int) Ds.size(); i++) {
			for(auto id : parid[Ds[i].sc]) vectoll[id] = 1;
			// if(parid[Ds[i].sc] != -1) vectoll[parid[Ds[i].sc]] = 1;
		}

		int toll = ask(vectoll);

		if(toll != tudoa) {
			s = Ds[mid].sc;
			lbs = mid+1;
		}
		else {
			rbs = mid-1;
		}
	}

	vector<pair<int,int>> Dt;
	for(int i = 0; i < n; i++) {
		if(d[i].sc == tt) {
			Dt.pb(mp(d[i].fr,i));
		}
	}
	sort(all(Dt));
	lbs = 0;
	rbs = (int) Dt.size()-1;
	int32_t t = -1;

	vectoll.clear(); vectoll.resize(m,1);
	for(int i = 0; i < (int) Dt.size(); i++) {
		for(auto id : parid[Dt[i].sc]) vectoll[id] = 0;
		// if(parid[Ds[i].sc] != -1) vectoll[parid[Ds[i].sc]] = 1;
	}
	toll0 = ask(vectoll);

	while(lbs <= rbs) {
		int mid = (lbs+rbs)/2;

		vectoll.clear(); vectoll.resize(m,1);

		// for(int i = 0; i <= mid; i++) {
		// 	if(parid[Dt[i].sc] != -1) vectoll[parid[Dt[i].sc]] = 0;
		// }

		for(int i = 0; i <= mid; i++) {
			for(auto id : parid[Dt[i].sc]) vectoll[id] = 0;
			// if(parid[Dt[i].sc] != -1) vectoll[parid[Dt[i].sc]] = 1;
		}

		int toll = ask(vectoll);

		if(toll == toll0) {
			t = Dt[mid].sc;
			rbs = mid-1;
		}
		else {
			lbs = mid+1;
		}
	}

	// cout << ss << " " << tt << endl;
	// cout << s << " " << t << endl;
	answer(s,t);
}

Compilation message

highway.cpp: In function 'void find_pair(int32_t, std::vector<int>, std::vector<int>, int32_t, int32_t)':
highway.cpp:26:6: warning: unused variable 'path' [-Wunused-variable]
   26 |  int path = tudoa/A;
      |      ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4432 KB Output is correct
2 Correct 2 ms 4432 KB Output is correct
3 Correct 3 ms 4560 KB Output is correct
4 Correct 2 ms 4432 KB Output is correct
5 Correct 3 ms 4432 KB Output is correct
6 Correct 2 ms 4432 KB Output is correct
7 Correct 2 ms 4432 KB Output is correct
8 Correct 2 ms 4432 KB Output is correct
9 Correct 2 ms 4432 KB Output is correct
10 Correct 2 ms 4432 KB Output is correct
11 Correct 2 ms 4432 KB Output is correct
12 Correct 2 ms 4432 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4560 KB Output is correct
2 Correct 11 ms 6096 KB Output is correct
3 Correct 112 ms 17040 KB Output is correct
4 Correct 169 ms 17060 KB Output is correct
5 Correct 121 ms 17152 KB Output is correct
6 Correct 133 ms 17052 KB Output is correct
7 Correct 129 ms 17104 KB Output is correct
8 Correct 129 ms 17144 KB Output is correct
9 Correct 103 ms 17076 KB Output is correct
10 Correct 122 ms 17144 KB Output is correct
11 Correct 108 ms 16748 KB Output is correct
12 Correct 114 ms 16500 KB Output is correct
13 Correct 135 ms 16624 KB Output is correct
14 Correct 117 ms 16472 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 5968 KB Output is correct
2 Correct 39 ms 7240 KB Output is correct
3 Correct 25 ms 8432 KB Output is correct
4 Correct 114 ms 16472 KB Output is correct
5 Correct 91 ms 16460 KB Output is correct
6 Correct 74 ms 16856 KB Output is correct
7 Correct 83 ms 16512 KB Output is correct
8 Correct 79 ms 15940 KB Output is correct
9 Correct 84 ms 16476 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4560 KB Output is correct
2 Correct 15 ms 5912 KB Output is correct
3 Correct 79 ms 14780 KB Output is correct
4 Correct 121 ms 17028 KB Output is correct
5 Correct 109 ms 17020 KB Output is correct
6 Correct 126 ms 17108 KB Output is correct
7 Correct 105 ms 17048 KB Output is correct
8 Correct 149 ms 17036 KB Output is correct
9 Correct 121 ms 17052 KB Output is correct
10 Correct 156 ms 17104 KB Output is correct
11 Correct 119 ms 16460 KB Output is correct
12 Correct 131 ms 16820 KB Output is correct
13 Correct 127 ms 16472 KB Output is correct
14 Correct 114 ms 16324 KB Output is correct
15 Correct 121 ms 17144 KB Output is correct
16 Correct 95 ms 17120 KB Output is correct
17 Correct 109 ms 16560 KB Output is correct
18 Correct 159 ms 16460 KB Output is correct
19 Correct 145 ms 17064 KB Output is correct
20 Correct 139 ms 16612 KB Output is correct
21 Correct 94 ms 18004 KB Output is correct
22 Correct 117 ms 18012 KB Output is correct
23 Correct 139 ms 17600 KB Output is correct
24 Correct 106 ms 17584 KB Output is correct
25 Correct 122 ms 16608 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 5932 KB Output is correct
2 Correct 13 ms 6132 KB Output is correct
3 Correct 133 ms 17508 KB Output is correct
4 Incorrect 155 ms 17456 KB Output is incorrect: {s, t} is wrong.
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 16 ms 5952 KB Output is incorrect: {s, t} is wrong.
2 Halted 0 ms 0 KB -