Submission #671380

#TimeUsernameProblemLanguageResultExecution timeMemory
671380coding_snorlaxThe Big Prize (IOI17_prize)C++14
94.71 / 100
53 ms336 KiB
#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;
 
    for(int i=1;i<=min(500,n-1);i++){
        auto it = ask(i);
        Total = max(Total, it[0] + it[1]);
    }
    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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...