Submission #1348219

#TimeUsernameProblemLanguageResultExecution timeMemory
1348219inesfiThe Big Prize (IOI17_prize)C++20
90 / 100
321 ms4608 KiB
#include "prize.h"
#include<bits/stdc++.h>
using namespace std;

const int DECA=(1<<18);
int arbre[2*DECA];

int somme(int a, int b){
	if (a==b){
		return arbre[a];
	}
	if (a%2==1){
		return arbre[a]+somme(a+1, b);
	}
	if (b%2==0){
		return somme(a,b-1)+arbre[b];
	}
	return somme(a/2, b/2);
}

void modif(int a){
	while (a>1){
		a/=2;
		arbre[a]=arbre[2*a]+arbre[2*a+1];
	}
}

int find_best(int n) {
	int val_maxi=0;
	for (int i=0;i<min(n,500);i++){
		vector<int> quest=ask(i);
		val_maxi = max(val_maxi, quest[0]+quest[1]);
	}
	int nb_petits=val_maxi;
	vector<int> encours;
	for (int i=0;i<n;i++){
		encours.push_back(i);
	}
	vector<int> petits;
	for (int i=0;i<nb_petits;i++){
		int deb=0, fin=encours.size()-1;
		int nbdeb=somme(DECA, encours[0]+DECA);
		while (deb<fin){
			int mil=(deb+fin+1)/2;
			vector<int> quest=ask(encours[mil]);
			if (quest[0]+quest[1]!=val_maxi){
				deb=mil;
				fin=mil;
			}
			else {
				if (nbdeb!=quest[0]-somme(encours[deb]+DECA, encours[mil]+DECA)){
					fin=mil-1;
				}
				else {
					nbdeb=quest[0];
					deb=mil;
				}
			}
		}
		arbre[encours[deb]+DECA]+=1;
		modif(encours[deb]+DECA);
		petits.push_back(encours[deb]);
		vector<int> nouv_encours;
		for (auto a:encours){
			if (a!=encours[deb]){
				nouv_encours.push_back(a);
			}
		}
		encours=nouv_encours;
	}
	int rep=0;
	for (auto r:petits){
		vector<int> quest=ask(r);
		if (quest[0]+quest[1]==0){
			rep=r;
		}
	}
	return rep;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...