Submission #296251

#TimeUsernameProblemLanguageResultExecution timeMemory
296251PeppaPigHighway Tolls (IOI18_highway)C++14
51 / 100
222 ms15068 KiB
#include "highway.h"
#include <bits/stdc++.h>

#define long long long
#define pii pair<int, int>
#define x first
#define y second

using namespace std;

const int N = 2e5 + 5;

int n, m, A, B;
int chk[N], par[N];
vector<int> u, v;
vector<pii> g[N];

void find_pair(int _n, vector<int> _u, vector<int> _v, int _A, int _B) {
	n = _n, m = (int)_u.size(), u = _u, v = _v, A = _A, B = _B;

	for(int i = 0; i < m; i++) {
		g[u[i]].emplace_back(v[i], i);
		g[v[i]].emplace_back(u[i], i);
	}

	int rot = 0;
	long mn_dist = ask(vector<int>(m));
	vector<int> ans;
	
	for(int _ = 0; _ < 2; _++) {
		queue<int> Q;
		vector<int> vec;

		memset(chk, 0, sizeof chk);

		Q.emplace(rot), chk[rot] = 1, par[rot] = rot;
		while(!Q.empty()) {
			int u = Q.front(); Q.pop();
			for(pii v : g[u]) if(!chk[v.x]) {
				chk[v.x] = 1, par[v.x] = u;
				vec.emplace_back(v.y);
				Q.emplace(v.x);
			}
		}

		reverse(vec.begin(), vec.end());

		//printf("rot = %d\n", rot);
		//for(int i : vec) printf("%d ", i);
		//printf("\n");

		int l = 0, r = (int)vec.size() - 1;
		while(l < r) {
			int mid = (l + r) >> 1;

			vector<int> now(m);
			for(int i = 0; i <= mid; i++) now[vec[i]] = 1;
			if(ask(now) > mn_dist) r = mid;
			else l = mid + 1;
		}

		int a = u[vec[r]], b = v[vec[r]];
		if(par[b] == a) swap(a, b);
		ans.emplace_back(rot = a);
	}
	//printf("answer = %d %d\n", ans[0], ans[1]);

	answer(ans[0], ans[1]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...