# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1202465 | hyakup | Radio Towers (IOI22_towers) | C++20 | 0 ms | 0 KiB |
#include "towers.h"
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
using ll = long long;
const ll inf = 1e10;
const int maxn = 1e5 + 10;
const int logn = 20;
int n;
vector<ll> h, vr, vl;
vector<ll> v;
void init(int N, vector<int> H) {
h = H;
n = N;
vr.resize(n);
vl.resize(n);
v.resize(n);
// achar primeiro menor a esq e dir
vector<int> l(n, -1), r(n, n);
stack<pair<int, ll>> pilha;
pilha.push({-1, -inf});
for( int i = 0; i < n; i++ ){
while( pilha.top().second > h[i] ){
r[pilha.top().first] = i;
pilha.pop();
}
l[i] = pilha.top().first;
pilha.push({ i, h[i] });
}
vector<vector<ll>> maxi( n, vector<ll>(logn));
for( int i = 0; i < n; i++ ) maxi[i][0] = h[i];
for( int k = 1; k < logn; k++ )
for( int i = 0; i < n - (1<<k) + 1; i++ ) maxi[i][k] = max( maxi[i][k - 1], maxi[i + (1<<(k - 1))][k - 1] );
auto query = [&]( int a, int b ){
if( a > b ) return -inf;
int k = 31 - __builtin_clz(b - a + 1);
return max( maxi[a][k], maxi[b - (1<<k) + 1][k] );
};
for( int i = 0; i < n; i++ ){
if( l[i] == -1 ) vl[i] = inf;
else vl[i] = query(l[i] + 1, i - 1) - h[i];
if( r[i] == n ) vr[i] = inf;
else vr[i] = query(i + 1, r[i] - 1) - h[i];
if( i != 0 && i != n - 1 ) v[i] = min( vl[i], vr[i] );
else v[i] = -inf;
}
sort( v.begin(), v.end() );
}
int max_towers(int l, int r, int d) {
int id = lower_bound( v.begin(), v.end(), d ) - v.begin();
int resp = n - id;
if( vr[l] >= d ) resp++;
if( vl[r] >= d ) resp++;
return resp;
}