Submission #836277

#TimeUsernameProblemLanguageResultExecution timeMemory
836277mousebeaverMeetings (IOI18_meetings)C++14
17 / 100
86 ms13520 KiB
#define ll long long
#include "meetings.h"
#include <bits/stdc++.h>
using namespace std;

ll left(ll i)
{
    return 2*i;
}

ll right(ll i)
{
    return 2*i+1;
}

struct node
{
    ll bleft;
    ll bright;
    ll bmax;
    ll len;
};

node combine(node l, node r)
{
    node output = {0, 0, 0, 0};

    if(l.bleft == l.len)
    {
        output.bleft = l.bleft + r.bleft;
    }
    else
    {
        output.bleft = l.bleft;
    }

    if(r.bright == r.len)
    {
        output.bright = r.bright+l.bright;
    }
    else
    {
        output.bright = r.bright;
    }

    output.bmax = max(max(r.bmax, l.bmax), r.bleft + l.bright);
    output.len = l.len+r.len;
    return output;
}

node query(ll i, vector<node>& s, ll a, ll b, ll l, ll r)
{
    if(l <= a && b <= r)
    {
        return s[i];
    }
    if(r < a || b < l)
    {
        return {0, 0, 0, 0};
    }

    ll mid = (a+b)/2;
    return combine(query(left(i), s, a, mid, l, r), query(right(i), s, mid+1, b, l, r));
}

std::vector<long long> minimum_costs(std::vector<int> H, std::vector<int> L, std::vector<int> R) 
{
    ll n = H.size();
    ll segnodes = 1;
    while(2*n > segnodes)
    {
        segnodes *= 2;
    }
    vector<node> s(segnodes, {0, 0, 0, 1});

    for(ll i = 0; i < n; i++)
    {
        if(H[i] == 1)
        {
            s[i+segnodes/2] = {1, 1, 1, 1};
        }
    }
    for(ll i = segnodes/2-1; i > 0; i--)
    {
        s[i] = combine(s[left(i)], s[right(i)]);
    }

    vector<ll> output(0);
    for(ll i = 0; i < (ll) L.size(); i++)
    {
        ll mountains = R[i]+1-L[i];
        output.push_back(2*mountains - query(1, s, 1, segnodes/2, L[i]+1, R[i]+1).bmax);
    }
    return output;
}
#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...