제출 #1209488

#제출 시각아이디문제언어결과실행 시간메모리
1209488AvianshMeetings (IOI18_meetings)C++20
17 / 100
80 ms8676 KiB
#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 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...