This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#include "prize.h"
using namespace std;
int N;
int Total=0;
int answer;
void recurtion(int left,int left_ans,int right,int right_ans,int split_answer){
//cout<<left<<" "<<left_ans<<" "<<right<<" "<<right_ans<<" "<<split_answer<<"\n";
if(!split_answer) return;
else{
int M=(left+right)/2;
for(int i=M;i>=left;i--){
auto it = ask(i);
if((it[0]+it[1])==Total){
recurtion(left,left_ans,i,it[1],it[0]-left_ans);
recurtion(M+1,it[0]+(M-i),right,right_ans,it[1]-right_ans-(M-i));
return;
}
else if(it[0]==0 && it[1]==0){
answer=i;
return;
}
}
for(int i=M+1;i<=right;i++){
auto it = ask(i);
if((it[0]+it[1])==Total){
recurtion(i+1,it[0],right,right_ans,it[1]-right_ans);
return;
}
else if(it[0]==0 && it[1]==0){
answer=i;
return;
}
}
}
}
int find_best(int n){
N=n;
//should optimize here!
for(int i=1;i<=min(470,n-1);i++){
auto it = ask(i);
Total = max(Total, it[0] + it[1]);
}
//may get 5 more points!
if(n<=1024){
for(int i=0;i<n;i++){
auto it = ask(i);
if(!(it[0]+it[1])) return i;
}
}
int now=0*1024;
auto it = ask(now);
if(!(it[0]+it[1])) return now;
while((it[0]+it[1])<Total){
if(!(it[0]+it[1])) return now;
now++;
it = ask(now);
}
for(int i=0;i<(n/1024)+1;i++){
int now1 = min((i+1)*1024,n-1);
auto it1 = ask(now1);
if(!(it1[0]+it1[1])) return now1;
while((it1[0]+it1[1])<Total){
if(!(it1[0]+it1[1])) return now1;
now1--;
it1 = ask(now1);
}
recurtion(now,it[0],now1,it1[1],it1[0]-it[0]);
now=now1;
it=it1;
}
return answer;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |