Submission #169880

#TimeUsernameProblemLanguageResultExecution timeMemory
169880dennisstarHighway Tolls (IOI18_highway)C++11
0 / 100
27 ms3368 KiB
#include "highway.h"
#include <bits/stdc++.h>
#define fi first
#define se second
#define ryan bear
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef long double ld;
typedef vector<int> vim;

vim G[90010];
int chk[90010];

void find_pair(int N, vim U, vim V, int A, int B) {
	int M=U.size();
	vim w(M);
	ll L=ask(w)/A;

	for (int i=0; i<M; i++) G[U[i]].push_back(V[i]), G[V[i]].push_back(U[i]);

	int s, e;
	for (s=0, e=M-1; s<e; ) {
		int m=(s+e)/2;
		fill(w.begin(), w.begin()+m+1, 1);
		fill(w.begin()+m+1, w.end(), 0);
		if (L*A!=ask(w)) e=m;
		else s=m+1;
	}

	vector<pii> stk; vector<int> ar[2];
	stk.push_back({0, U[s]}); stk.push_back({1, V[s]});
	chk[U[s]]=chk[V[s]]=1;
	for (int i=0; i<stk.size(); i++) {
		ar[stk[i].fi].push_back(stk[i].se);
		for (int j:G[stk[i].se]) {
			if (chk[j]) continue;
			chk[j]=1;
			stk.push_back({stk[i].fi, j});
		}
	}

	int S, T;
	for (s=0, e=ar[0].size()-1; s<e; ) {
		int m=(s+e+1)/2;
		vim X(ar[0].size());
		fill(w.begin(), w.end(), 0);
		for (int i=m; i<ar[0].size(); i++) X[i]=1;
		for (int i=0; i<M; i++) {
			if (X[U[i]]!=X[V[i]]) w[i]=1;
		}
		if (L*A!=ask(w)) s=m;
		else e=m-1;
	}
	S=ar[0][s];

	for (s=0, e=ar[1].size()-1; s<e; ) {
		int m=(s+e+1)/2;
		vim X(ar[1].size());
		fill(w.begin(), w.end(), 0);
		for (int i=m; i<ar[1].size(); i++) X[i]=1;
		for (int i=0; i<M; i++) {
			if (X[U[i]]!=X[V[i]]) w[i]=1;
		}
		if (L*A!=ask(w)) s=m;
		else e=m-1;
	}
	T=ar[1][s];

	answer(S, T);
}

Compilation message (stderr)

highway.cpp: In function 'void find_pair(int, vim, vim, int, int)':
highway.cpp:35:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i=0; i<stk.size(); i++) {
                ~^~~~~~~~~~~
highway.cpp:49:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i=m; i<ar[0].size(); i++) X[i]=1;
                 ~^~~~~~~~~~~~~
highway.cpp:62:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i=m; i<ar[1].size(); i++) X[i]=1;
                 ~^~~~~~~~~~~~~
#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...