Submission #1232153

#TimeUsernameProblemLanguageResultExecution timeMemory
1232153VMaksimoski008Radio Towers (IOI22_towers)C++20
0 / 100
215 ms10732 KiB
#include "towers.h"
#include <bits/stdc++.h>
using namespace std;
const int mxn = 1e5 + 5;

vector<int> V;
int a[mxn], n, T[mxn][20];

int query(int l, int r) {
    int k = __lg(r - l + 1);
    return max( T[l][k], T[r-(1<<k)+1][k] );
}

void init(int _n, vector<int> H) {
    n = _n;
    for(int i=0; i<n; i++) {
        a[i] = H[i];
        T[i][0] = a[i];
    }

    for(int j=1; j<20; j++)
        for(int i=0; i+(1<<j)-1<n; i++)
            T[i][j] = max( T[i][j-1], T[i+(1<<(j-1))][j-1] );

    vector<int> L(n, -1), R(n, n);

    stack<int> st;
    for(int i=0; i<n; i++) {
        while(!st.empty() && a[st.top()] >= a[i]) st.pop();
        if(!st.empty()) L[i] = st.top();
        st.push(i);
    }

    while(!st.empty()) st.pop();

    for(int i=n-1; i>=0; i--) {
        while(!st.empty() && a[st.top()] >= a[i]) st.pop();
        if(!st.empty()) R[i] = st.top();
        st.push(i);
    }

    for(int i=0; i<n; i++) {
        if(L[i] == i-1 && R[i] == i+1) {
            V.push_back(-1e9);
            continue;
        }

        int mx = 1e9;
        if(L[i] != i-1) mx = min(mx, query(L[i]+1, i-1));
        if(R[i] != i+1) mx = min(mx, query(i+1, R[i]-1));
        V.push_back(mx);
    }
    sort(V.begin(), V.end());
}

int max_towers(int L, int R, int D) {
    int l=0, r=n-1, p=n-1;
    while(l <= r) {
        int mid = (l + r) / 2;
        if(V[mid] >= D) p = mid, r = mid - 1;
        else l = mid + 1;
    }

    return n-p;
}
#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...