Submission #1137875

#TimeUsernameProblemLanguageResultExecution timeMemory
1137875onlk97Radio Towers (IOI22_towers)C++20
17 / 100
271 ms9508 KiB
#include "towers.h"
#include <bits/stdc++.h>
using namespace std;
int n,a[100010],d[100010];
int sp[18][100010],Lg[100010];
int qry(int l,int r){
    if (l>r) return -1e9;
    int g=Lg[r-l+1];
    return max(sp[g][l],sp[g][r-(1<<g)+1]);
}
void init(int N,vector <int> H){
    n=N;
    for (int i=1; i<=n; i++) a[i]=H[i-1];
    for (int i=1; i<=n; i++) sp[0][i]=a[i];
    for (int j=1; (1<<j)<=n; j++){
        for (int i=1; i+(1<<j)-1<=n; i++) sp[j][i]=max(sp[j-1][i],sp[j-1][i+(1<<(j-1))]);
    }
    Lg[1]=0;
    for (int i=2; i<=n; i++) Lg[i]=Lg[i>>1]+1;
    int prv[n+1],nxt[n+1];
    stack <int> st;
    for (int i=1; i<=n; i++){
        while (!st.empty()&&a[st.top()]>a[i]) st.pop();
        if (st.empty()) prv[i]=0;
        else prv[i]=st.top();
        st.push(i);
    }
    while (!st.empty()) st.pop();
    for (int i=n; i; i--){
        while (!st.empty()&&a[st.top()]>a[i]) st.pop();
        if (st.empty()) nxt[i]=0;
        else nxt[i]=st.top();
        st.push(i);
    }
    for (int i=1; i<=n; i++){
        int lim=1e9;
        if (prv[i]) lim=min(lim,qry(prv[i]+1,i-1)-a[i]);
        if (nxt[i]) lim=min(lim,qry(i+1,nxt[i]-1)-a[i]);
        d[i]=lim;
    }
    sort(d+1,d+n+1);
}
int max_towers(int L,int R,int D){
    L++; R++;
    int idx=lower_bound(d+1,d+n+1,D)-d;
    return n+1-idx;
}
#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...