Submission #769050

#TimeUsernameProblemLanguageResultExecution timeMemory
769050SanguineChameleonHighway Tolls (IOI18_highway)C++17
5 / 100
208 ms262144 KiB
#include "highway.h"
#include <bits/stdc++.h>
using namespace std;

const int maxN = 9e4 + 20;
vector<pair<int, int>> adj[maxN];
int depth[maxN];
int par_id[maxN];
int N, M, A, B;

void dfs1(int u, int p) {
	for (auto e: adj[u]) {
		int v = e.first;
		int id = e.second;
		if (v != p) {
			depth[v] = depth[u] + 1;
			par_id[v] = id;
			dfs1(v, u);
		}
	}
}

int find_depth(int root, int d) {
	if (d == 0) {
		return root;
	}
	depth[root] = 0;
	dfs1(root, -1);
	vector<int> query(M, 0);
	vector<pair<int, int>> cand;
	for (int i = 0; i < N; i++) {
		if (depth[i] == d) {
			cand.emplace_back(i, par_id[i]);
		}
	}
	while ((int)cand.size() > 1) {
		int sz = cand.size();
		vector<pair<int, int>> left(cand.begin(), cand.begin() + sz / 2);
		vector<pair<int, int>> right(cand.begin() + sz / 2, cand.end());
		for (auto p: left) {
			query[p.second] = 1;
		}
		int res = ask(query);
		for (auto p: left) {
			query[p.second] = 0;
		}
		if (res == 1LL * A * d) {
			cand = right;
		}
		else {
			cand = left;
		}
	}
	return cand[0].first;
}

void find_pair(int _N, vector<int> U, vector<int> V, int _A, int _B) {
	N = _N;
	M = U.size();
	A = _A;
	B = _B;
	for (int i = 0; i < M; i++) {
		adj[U[i]].emplace_back(V[i], i);
		adj[V[i]].emplace_back(U[i], i);
	}
	int dist = ask(vector<int>(M, 0)) / A;
	int S = find_depth(0, 0);
	int T = find_depth(S, dist);
	answer(S, T);
}
#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...