제출 #1269594

#제출 시각아이디문제언어결과실행 시간메모리
1269594AlgorithmWarrior커다란 상품 (IOI17_prize)C++20
100 / 100
15 ms4736 KiB
#include "prize.h"

#include <bits/stdc++.h>

using namespace std;

int const NMAX=200005;
vector<int>rasp[NMAX];
int maxim;
#define pii pair<int,int>
#define ff first
#define ss second
int raspuns_final;

void intrb(int i){
    vector<int>v=ask(i-1);
    rasp[i]=v;
    if(v[0]+v[1]==0)
        raspuns_final=i-1;
}

pii extinde(int pos){
    if(rasp[pos][0]+rasp[pos][1]==maxim)
        return {pos,pos};
    int l=pos;
    while(rasp[l-1].empty()){
        --l;
        intrb(l);
        if(rasp[l][0]+rasp[l][1]==maxim)
            break;
    }
    int r=pos;
    while(rasp[r+1].empty()){
        ++r;
        intrb(r);
        if(rasp[r][0]+rasp[r][1]==maxim)
            break;
    }
    return {l,r};
}

void cauta(int l,int r){
    int mij=(l+r)/2;
    intrb(mij);
    pii per=extinde(mij);
    if(l<per.ff && rasp[l-1]!=rasp[per.ff])
        cauta(l,per.ff-1);
    if(per.ss<r && rasp[per.ss]!=rasp[r+1])
        cauta(per.ss+1,r);
}

int find_best(int n){
    int pas=sqrt(n);
    int i;
    for(i=pas;i<=n;i+=pas){
        intrb(i);
        maxim=max(maxim,rasp[i][0]+rasp[i][1]);
    }
    rasp[0]={0,maxim};
    rasp[n+1]={maxim,0};
    for(i=pas;i<=n;i+=pas)
        extinde(i);
    int ult=0;
    for(i=1;i<=n+1;++i)
        if(!rasp[i].empty() && rasp[i][0]+rasp[i][1]==maxim){
            if(rasp[ult+1].empty())
                cauta(ult+1,i-1);
            ult=i;
        }
    return raspuns_final;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...