Submission #1274372

#TimeUsernameProblemLanguageResultExecution timeMemory
1274372nicolo_010통행료 (IOI18_highway)C++20
51 / 100
70 ms12036 KiB
#include <bits/stdc++.h>
#include "highway.h"
using namespace std;
using ll = long long;
using pii = pair<int, int>;

vector<vector<pii>> adj;
vector<int> endp;
vector<int> edge;
int t;
vector<int> query;
ll w;

void dfs(int n, int p) {
	for (auto x : adj[n]) {
		if (x.second == p) continue;
		endp[t] = x.second;
		edge[x.first] = t++;
		dfs(x.second, n);
	}
}

int first(int M) {
	int l = 0, r = M-1;
	int ans = 0;
	while (l <= r) {
		int m = (l+r)/2;
		for (int i=0; i<M; i++) {
			query[i] = (i <= m);
		}
		ll w2 = ask(query);
		if (w2 != w) {
			r=m-1;
		}
		else {
			l = m+1;
			ans = m+1;
		}
	}
	return ans;
}

int last(int M) {
	int l=0, r = t-1;
	int ans=-1;
	while (l <= r) {
		int m = (l+r+1)/2;
		for (int i=0; i<M; i++) {
			query[i] = (edge[i] >= m);
		}
		ll w2 = ask(query);
		if (w2 != w) {
			l = m+1;
			ans = m;
		}
		else {
			r = m-1;
		}
	}
	return ans;
}

void find_pair(int n, vector<int> U, vector<int> V, int A, int B) {
	int m = U.size();
	query.assign(m, 0);
	w = ask(query);
	adj.resize(n);
	for (int i=0; i<m; i++) {
		int a = U[i];
		int b = V[i];
		adj[a].push_back({i, b});
		adj[b].push_back({i, a});
	}
	edge.resize(m);
	endp.resize(m);
	t=0;
	dfs(0, -1);
	int e = first(m);
	int v = U[e];
	int u = V[e];
	vector<int> ans(2);
	//cout << e << endl;
	for (int i=0; i<2; i++) {
		t = 0;
		edge.assign(m, -1);
		dfs(v, u);
		int le = last(m);
		//cout << le << endl;
		ans[i] = (le==-1 ? v : endp[le]);
		//cout << ans[i] << endl;
		swap(v, u);
	}
	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...