제출 #1015628

#제출 시각아이디문제언어결과실행 시간메모리
1015628inesfi송신탑 (IOI22_towers)C++17
23 / 100
4078 ms19976 KiB
#include "towers.h"
#include<bits/stdc++.h>
using namespace std;

const int DECALAGE=(1<<17);
int pb,avant,apres,rep;
vector<int> h;
vector<pair<int,int>> altitudes;
int arbremax[DECALAGE*2];
set<int> pris;
set<int>::iterator it;

int maxi(int deb,int fin){
    if (deb==fin){
        return arbremax[deb];
    }
    if (deb%2==1){
        return max(arbremax[deb],maxi(deb+1,fin));
    }
    if (fin%2==0){
        return max(arbremax[fin],maxi(deb,fin-1));
    }
    return maxi(deb/2,fin/2);
}

void init(int N,vector<int> H) {
    h=H;
}

int max_towers(int L, int R, int D) {
    for (int i=L;i<=R;i++){
        altitudes.push_back(make_pair(h[i],i));
        arbremax[i+DECALAGE]=h[i];
    }
    for (int i=DECALAGE-1;i>=0;i--){
        arbremax[i]=max(arbremax[i*2],arbremax[i*2+1]);
    }
    sort(altitudes.begin(),altitudes.end());
    for (int i=0;i<(int)altitudes.size();i++){
        it=pris.lower_bound(altitudes[i].second);
        pb=0;
        if (it!=pris.end()){
            apres=*(it);
            if (maxi(altitudes[i].second+DECALAGE,apres+DECALAGE)-altitudes[i].first<D){
                pb=1;
            }
        }
        if (it!=pris.begin()){
            it--;
            avant=*(it);
            if (maxi(avant+DECALAGE,altitudes[i].second+DECALAGE)-altitudes[i].first<D){
                pb=1;
            }
        }
        if (pb==0){
            pris.insert(altitudes[i].second);
            rep++;
        }
    }
    return rep;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...