This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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, min(r[i], 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]-max(l[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 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... |