Submission #1336038

#TimeUsernameProblemLanguageResultExecution timeMemory
1336038sporknivesHighway Tolls (IOI18_highway)C++20
12 / 100
285 ms327680 KiB
#include <bits/stdc++.h>
#include "highway.h"
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;

vector<vector<pii>> adj;
vector<int> d;
vector<pii> par;
void dfs(int x, int p) {
	for(pii edge: adj[x]) {
		int i = edge.first, idx = edge.second;
		if(i==p)continue;
		par[i]={x, idx};
		d[i]=d[x]+1;
		dfs(i,x);
	}
}

void find_pair(int N, std::vector<int> U, std::vector<int> V, int A, int B) {
	adj.resize(N);
	d.resize(N);
	par.resize(N);
	int M = U.size();
	/*for (int j = 0; j < 50; ++j) {
	std::vector<int> w(M);
	for (int i = 0; i < M; ++i) {
	  w[i] = 0;
	}
	long long toll = ask(w);
	}*/
	vector<int> query; query.assign(M,0);
	ll toll = ask(query);
	ll depth = toll/A;
	for(int i=0;i<M;i++) {
		adj[U[i]].push_back({V[i],i});
		adj[V[i]].push_back({U[i],i});
	}
	
	d[0]=0;
	par[0]={0,-1};
	dfs(0,0);
	vector<int> nodes;
	for(int i=0;i<N;i++) {
		if(d[i]==depth)nodes.push_back(i);
	}
	
	int lo=0, hi=nodes.size()-1;
	//for(int i=0;i<N;i++) cout<<nodes[i]<<" ";
	//cout<<"\n";
	while(lo<hi) {
		int mid = (lo+hi)/2;
		vector<int> query; query.assign(M,0);
		//cout<<lo<<" "<<mid<<"\n";
		for(int i=lo;i<=mid;i++) {
			query[par[nodes[i]].second]=1;
		}
		ll toll2 = ask(query);
		if(toll2 != toll) {
			hi=mid;
		}
		else lo=mid+1;
	}
	answer(0, nodes[lo]);
}
#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...