Submission #1202468

#TimeUsernameProblemLanguageResultExecution timeMemory
1202468hyakup송신탑 (IOI22_towers)C++20
17 / 100
295 ms26256 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) {
  for( int x : H ) h.push_back(x); 
  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;
}
#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...