Submission #1364071

#TimeUsernameProblemLanguageResultExecution timeMemory
1364071stanirinaHighway Tolls (IOI18_highway)C++20
12 / 100
239 ms327680 KiB
#include "highway.h"
#include <bits/stdc++.h>

using namespace std;

int n,a,b,m;
vector<int> dep;
vector<vector<int>> g;

void dfs(int c, int p){
	for(auto a:g[c]){
		if(a==p)continue;
		dep[a]=dep[c]+1;
		dfs(a,c);
	}
}

void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) {
	n=N;
	a=A;
	b=B;
	m=U.size();
	dep.assign(n,0);
	g.resize(n);
	for(int i=0;i<n;i++)g[i].clear();
	for(int i=0;i<m;i++){
		g[U[i]].push_back(V[i]);
		g[V[i]].push_back(U[i]);
	}
	dfs(0,-1);	
	vector<int> upit(m,0);
	long long x=ask(upit);
	int d=x/(long long) a;
	vector<int> grane;
	for(int i=0;i<m;i++){
		if((dep[V[i]]==d && dep[U[i]]==d-1) || (dep[U[i]]==d && dep[V[i]]==d-1))grane.push_back(i);
	}
	int l=0;
	int r=grane.size()-1;
	while(l<r){
		int mid=l+(r-l)/2;
		upit.assign(m,0);
		for(int i=l;i<=mid;i++)upit[grane[i]]=1;
		long long y=ask(upit);
		if(x==y)l=mid+1;
		else r=mid;
	}
	if(dep[U[grane[l]]]==d) answer(0,U[grane[l]]);
	else answer(0,V[grane[l]]);
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...