Submission #1274363

#TimeUsernameProblemLanguageResultExecution timeMemory
1274363nicolo_010통행료 (IOI18_highway)C++20
12 / 100
76 ms9272 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;

int last;

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

void find_pair(int n, vector<int> U, vector<int> V, int A, int B) {
	int m = U.size();
	vector<int> query(m, 0);
	ll 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(n);
	endp.resize(n);
	t=0;
	dfs(0);
	int l = 0, r = t-1;
	int ans=-1;
	while (l <= r) {
		int mm = (l+r)/2;
		for (int i=0; i<m; i++) {
			query[i] = (edge[i] >= mm);
		}
		ll w2 = ask(query);
		if (w2 != w) {
			l = mm+1;
			ans = mm;
		}
		else {
			r = mm-1;
		}
	}
	answer(0, endp[ans]);
}
#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...