#include "towers.h"
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define vi vector<int>
#define vl vector<long long>
#define ff first
#define ss second
#define pii pair<int,int>
#define pll pair<long long, long long>
#define pb push_back
#define rep(i, b) for(int i = 0; i < (b); ++i)
#define rep2(i,a,b) for(int i = a; i <= (b); ++i)
#define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c)
#define count_bits(x) __builtin_popcountll((x))
#define all(x) (x).begin(),(x).end()
#define siz(x) (int)(x).size()
#define forall(it,x) for(auto& it:(x))
using namespace std;
//mt19937 mt;void random(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());}
//ll rand(ll a, ll b) {return a + (mt() % (b-a+1));}
const int INF = 1e9+50;
const ll INF_L = 1e18+40;
const ll MOD = 1e9+7;
const int tree_siz = 1024*256-1;
struct mmtree
{
pii dmax[tree_siz+1];
pii dmin[tree_siz+1];
void setup(vi arr)
{
rep(i,siz(arr))
{
dmax[tree_siz/2+1+i] = {arr[i],i};
dmin[tree_siz/2+1+i] = {arr[i],i};
}
rep2(i,tree_siz/2+1+siz(arr),tree_siz)
{
dmax[i] = {-2e9,i};
dmin[i] = {2e9,i};
}
for(int i = tree_siz/2; i >= 1; i--)
{
dmax[i] = max(dmax[i*2],dmax[i*2+1]);
dmin[i] = min(dmin[i*2],dmin[i*2+1]);
}
}
pair<pii,pii> query(int akt, int p1, int p2, int s1, int s2)
{
if(p2 < s1 || p1 > s2) return {{2e9,1},{-2e9,1}};
if(p1 >= s1 && p2 <= s2) return {dmin[akt],dmax[akt]};
pair<pii,pii> w1 = query(akt*2,p1,(p1+p2)/2,s1,s2);
pair<pii,pii> w2 = query(akt*2+1,(p1+p2)/2+1,p2,s1,s2);
return {min(w1.ff,w2.ff),max(w1.ss,w2.ss)};
}
pair<pii,pii> get_info(int l, int r)
{
return query(1,0,tree_siz/2,l,r);
}
};
int n;
int left_D[100'001];
int right_D[100'001];
mmtree mtree;
void init(int N, vi H)
{
n = N;
mtree.setup(H);
vector<pii> sort_poz;
rep(i,n) sort_poz.pb({H[i],i});
sort(all(sort_poz));
set<int> s;
forall(it,sort_poz)
{
auto ptr = s.lower_bound(it.ss);
if(ptr == s.end())
{
right_D[it.ss] = 1e9;
}
else
{
int nxt = *ptr;
int max_ = mtree.get_info(it.ss,nxt-1).ss.ff;
right_D[it.ss] = max_ - it.ff;
}
if(ptr == s.begin())
{
left_D[it.ss] = 1e9;
}
else
{
ptr--;
int prev = *ptr;
int max_ = mtree.get_info(prev+1,it.ss).ss.ff;
left_D[it.ss] = max_-it.ff;
}
s.insert(it.ss);
}
}
int max_towers(int L, int R, int D)
{
int ans = 0;
int first_ = 1e9;
int last_ = 0;
rep2(i,L,R)
{
if(left_D[i] >= D && right_D[i] >= D)
{
ans++;
first_ = min(first_,i);
last_ = i;
}
}
if(ans == 0)
{
int min_poz = mtree.get_info(L,R).ff.ss;
ans++;
last_ = min_poz;
first_ = min_poz;
}
rep2(i,L,first_-1)
{
if(right_D[i] >= D)
{
ans++;
break;
}
}
rep2(i,last_+1,R)
{
if(left_D[i] >= D)
{
ans++;
break;
}
}
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |