Submission #123901

#TimeUsernameProblemLanguageResultExecution timeMemory
123901nvmdavaHighway Tolls (IOI18_highway)C++17
100 / 100
411 ms10588 KiB
#include "highway.h"
#define pb push_back
#include <bits/stdc++.h>
using namespace std;

vector<int> adj[100005];
vector<int> path;
long long def;
vector<int> w;
int v[3], p[100005], cat[100005];
vector<int> com[3];
int solve(vector<int>& ve){
	reverse(ve.begin(), ve.end());
	int l = 0, r = ve.size() - 1;
	while(l != r){
		int m = (l + r) >> 1;
		for(int i = 0; i <= m; i++)
			w[p[ve[i]]] = 1;
		if(ask(w) > def) r = m;
		else l = m + 1;
		for(int i = 0; i <= m; i++)
			w[p[ve[i]]] = 0;
	}
	return ve[l];
}

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++){
		adj[U[i]].pb(i);
		adj[V[i]].pb(i);
		path.push_back(V[i] + U[i]);
	}
	w = vector<int>(m, 0);
	def = ask(w);	
	int l = 0, r = m - 1;
	while(l != r){
		int mm = (l + r) >> 1;
		for(int i = 0; i <= mm; i++)
			w[i] = 1;
		if(ask(w) > def) r = mm;
		else l = mm + 1;
		for(int i = 0; i <= mm; i++)
			w[i] = 0;
	}
	
	queue<pair<int, int> > q;
	q.push({V[l], 1});
	q.push({U[l], 2});
	cat[V[l]] = 1;
	p[V[l]] = l;
	p[U[l]] = l;
	cat[U[l]] = 2;
	com[1].pb(V[l]);
	com[2].pb(U[l]);
	while(!q.empty()){
		int u = q.front().first, t = q.front().second;
		q.pop();
		for(int x : adj[u]){
			int e = path[x] - u; 
			if(cat[e]) continue;
			cat[e] = t;
			com[t].pb(e);
			p[e] = x;
			q.push({e, t});
		}
	}
	for(int i = 0; i < m; i++)
		w[i] = 1;
	for(int i = 0; i < N; i++)
		w[p[i]] = 0;
	answer(solve(com[1]), solve(com[2]));
}
#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...