#include "meetings.h"
#include <bits/stdc++.h>
using namespace std;
struct segTree{
struct node{
int sum,pref,suf,best,len;
};
node *st;
node def;
int n;
node unite(node a, node b){
node ans;
ans.sum=a.sum+b.sum;
ans.len=a.len+b.len;
ans.pref=a.pref;
if(a.pref==a.len){
ans.pref+=b.pref;
}
ans.suf=b.suf;
if(b.suf==b.len){
ans.suf+=a.suf;
}
ans.best=max({a.best,b.best,a.suf+b.pref});
return ans;
}
segTree(int siz){
int x = ceil(log2(siz));
x++;
n=siz-1;
st=new node[(1<<x)];
def.sum=0;
def.pref=0;
def.suf=0;
def.best=0;
def.len=0;
fill(st,st+(1<<x),def);
}
void update(int l, int r, int ind, int i){
st[ind].len=r-l+1;
if(i<l||i>r)
return;
if(l==r){
st[ind].best=1;
st[ind].pref=1;
st[ind].suf=1;
st[ind].sum=1;
return;
}
int mid = (l+r)/2;
update(l,mid,ind*2+1,i);
update(mid+1,r,ind*2+2,i);
st[ind]=unite(st[ind*2+1],st[ind*2+2]);
}
node rquery(int l, int r, int s, int e, int ind){
st[ind].len=r-l+1;
if(e<l||s>r){
return def;
}
if(s<=l&&r<=e){
return st[ind];
}
int mid = (l+r)/2;
node x = unite(rquery(l,mid,s,e,ind*2+1),rquery(mid+1,r,s,e,ind*2+2));
return x;
}
int query(int l, int r){
return rquery(0,n,l,r,0).best;
}
};
vector<long long> minimum_costs(vector<int> h, vector<int> L, vector<int> R) {
int n = h.size();
int q = L.size();
vector<long long>ans(q);
segTree st(n);
for(int i = 0;i<n;i++){
if(h[i]==1){
st.update(0,n-1,0,i);
}
}
for(int i = 0;i<q;i++){
int best = st.query(L[i],R[i]);
int len = R[i]-L[i]+1;
ans[i]=1LL*best+2LL*(len-best);
}
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... |