Submission #765736

#TimeUsernameProblemLanguageResultExecution timeMemory
765736ono_de206Highway Tolls (IOI18_highway)C++14
12 / 100
106 ms8508 KiB
#include "highway.h"
#include<bits/stdc++.h>
using namespace std;

#define in insert
#define all(x) x.begin(),x.end()
#define pb push_back
#define eb emplace_back
#define ff first
#define ss second

// #define int long long
 
typedef long long ll;
typedef vector<int> vi;
typedef set<int> si;
typedef multiset<int> msi;
typedef pair<int, int> pii;
typedef vector<pii> vpii;

const int mxn = 1e5 + 10;
int id[mxn];
vector<int> l;
vector<pair<int, int>> g[mxn];

void dfs(int to, int fr, int now, int dis) {
	if(now == dis) {
		l.pb(to);
		return;
	}
	for(auto it : g[to]) {
		if(it.ff == fr) continue;
		id[it.ff] = it.ss;
		dfs(it.ff, to, now + 1, dis);
	}
}

void find_pair(int n, vector<int> U, vector<int> V, int A, int B) {
	int m = U.size();
	for(int i = 0; i < m; i++) {
		g[U[i]].eb(V[i], i);
		g[V[i]].eb(U[i], i);
	}
	vector<int> q(m, 1);
	long long tot = ask(q);
	int dis = tot / B;
	dfs(0, -1, 0, dis);
	int L = 0, R = (int)l.size() - 1;
	while(L < R) {
		int M = (L + R) / 2;
		for(int i = L; i <= M; i++) {
			q[id[l[i]]] = 0;
		}
		long long tmp = ask(q);
		for(int i = L; i <= M; i++) {
			q[id[l[i]]] = 1;
		}
		if(tmp == tot) L = M + 1;
		else R = M;
	}
	answer(0, l[R]);
}
#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...