Submission #1331167

#TimeUsernameProblemLanguageResultExecution timeMemory
1331167AMnuHighway Tolls (IOI18_highway)C++20
100 / 100
107 ms9508 KiB
#include "highway.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MAXN = 9e4+5;

int M, X, Y, L, R, mid, dist[2][MAXN];
ll D, E;
bool act[MAXN];
vector <int> B, S, adj[MAXN];
queue <int> Q;

void bfs(int s,int t) {
	Q.push(s);
	dist[t][s] = 1;
	while (!Q.empty()) {
		int x = Q.front();
		Q.pop();
		for (int y : adj[x]) {
			if (!dist[t][y]) {
				dist[t][y] = dist[t][x]+1;
				Q.push(y);
			}
		}
	}
}

bool cmp(int x,int y) {
	return dist[0][x] > dist[0][y];
}

void find_pair(int N,vector<int> U,vector<int> V,int A,int b) {
	M = U.size();
	for (int i=0;i<M;i++) {
		B.push_back(0);
	}
	D = ask(B);
	L = 0;
	R = M-1;
	while (L < R) {
		mid = (L+R)>>1;
		for (int i=0;i<=mid;i++) {
			B[i] = 0;
		}
		for (int i=mid+1;i<M;i++) {
			B[i] = 1;
		}
		E = ask(B);
		if (E == D) {
			R = mid;
		}
		else {
			L = mid+1;
		}
	}
	X = U[L];
	Y = V[L];
	for (int i=0;i<M;i++) {
		adj[U[i]].push_back(V[i]);
		adj[V[i]].push_back(U[i]);
	}
	bfs(X,0);
	bfs(Y,1);
	for (int i=0;i<N;i++) {
		if (dist[0][i] < dist[1][i] && dist[0][i] <= D/A) {
			S.push_back(i);
		}
	}
	sort(S.begin(),S.end(),cmp);
	L = 0;
	R = S.size()-1;
	while (L < R) {
		mid = (L+R)>>1;
		for (int i=0;i<N;i++) {
			act[i] = 0;
		}
		for (int i=0;i<=mid;i++) {
			act[S[i]] = 1;
		}
		for (int i=0;i<M;i++) {
			B[i] = act[U[i]]||act[V[i]];
		}
		E = ask(B);
		if (E == D) {
			L = mid+1;
		}
		else {
			R = mid;
		}
	}
	X = S[L];
	S.clear();
	for (int i=0;i<N;i++) {
		if (dist[0][i] > dist[1][i] && dist[0][X]+dist[1][i]-1 == D/A) {
			S.push_back(i);
		}
	}
	L = 0;
	R = S.size()-1;
	while (L < R) {
		mid = (L+R)>>1;
		for (int i=0;i<N;i++) {
			act[i] = 0;
		}
		for (int i=0;i<=mid;i++) {
			act[S[i]] = 1;
		}
		for (int i=0;i<M;i++) {
			B[i] = act[U[i]]||act[V[i]];
		}
		E = ask(B);
		if (E == D) {
			L = mid+1;
		}
		else {
			R = mid;
		}
	}
	Y = S[L];
	answer(X, Y);
}
#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...