Submission #601851

#TimeUsernameProblemLanguageResultExecution timeMemory
601851HanksburgerMeetings (IOI18_meetings)C++17
19 / 100
520 ms313580 KiB
#include "meetings.h"
#include <bits/stdc++.h>
using namespace std;
long long mx[5005][5005], sum[5005][5005];
vector<pair<int, int> > v;
vector<long long> ans;
int seg[3000005];
void build(int i, int l, int r)
{
    if (l==r)
    {
        seg[i]=v[l].second-v[l].first+1;
        return;
    }
    int m=(l+r)/2;
    build(i*2, l, m);
    build(i*2+1, m+1, r);
    seg[i]=max(seg[i*2], seg[i*2+1]);
}
int query(int i, int l, int r, int ql, int qr)
{
    if (ql<=l && r<=qr)
        return seg[i];
    int m=(l+r)/2, res=0;
    if (l<=qr && ql<=m)
        res=max(res, query(i*2, l, m, ql, qr));
    if (m+1<=qr && ql<=r)
        res=max(res, query(i*2+1, m+1, r, ql, qr));
    return res;
}
vector<long long> minimum_costs(vector<int> a, vector<int> l, vector<int> r)
{
    int n=a.size(), q=l.size();
    if (n<=5000 && q<=5000)
    {
        for (int i=0; i<n; i++)
        {
            mx[i][i]=sum[i][i]=a[i];
            for (int j=i+1; j<n; j++)
            {
                mx[i][j]=max(mx[i][j-1], (long long)a[j]);
                sum[i][j]=sum[i][j-1]+mx[i][j];
            }
            for (int j=i-1; j>=0; j--)
                sum[i][j]=sum[i][j+1]+mx[j][i];
        }
        for (int i=0; i<q; i++)
        {
            long long mn=1e18;
            for (int j=l[i]; j<=r[i]; j++)
                mn=min(mn, sum[j][l[i]]+sum[j][r[i]]-a[j]);
            ans.push_back(mn);
        }
        return ans;
    }
    int ind=0, sz;
    for (int i=1; i<n; i++)
    {
        if (a[i-1]==1 && a[i]==2)
            v.push_back({ind, i-1});
        else if (a[i-1]==2 && a[i]==1)
            ind=i;
    }
    if (a[n-1]==1)
        v.push_back({ind, n-1});
    sz=v.size();
    if (!sz)
    {
        for (int i=0; i<q; i++)
            ans.push_back((r[i]-l[i]+1)*2);
        return ans;
    }
    build(1, 0, sz-1);
    for (int i=0; i<q; i++)
    {
        int res=0;
        if (l[i] && a[l[i]-1]==1 && a[l[i]]==1)
        {
            int x=lower_bound(v.begin(), v.end(), make_pair(l[i], 0))-v.begin()-1;
            res=max(res, v[x].second-l[i]+1);
        }
        if (r[i]<=n-2 && a[r[i]]==1 && a[r[i]+1]==1)
        {
            int x=lower_bound(v.begin(), v.end(), make_pair(r[i]+1, 0))-v.begin()-1;
            res=max(res, r[i]-v[x].first+1);
        }
        int x=lower_bound(v.begin(), v.end(), make_pair(l[i], 0))-v.begin();
        int y=lower_bound(v.begin(), v.end(), make_pair(r[i]+1, 0))-v.begin()-1;
        if (y>=0 && v[y].second>r[i])
            y--;
        if (x>=0 && x<=y)
            res=max(res, query(1, 0, sz-1, x, y));
        ans.push_back((r[i]-l[i]+1)*2-res);
    }
    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...