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<iostream>
#include<deque>
using namespace std;
const int INF = 1e9;
int n,k;
int a[100005];
int tole[100005];
int tori[100005];
int mymin(int x, int y)
{
if(x==0)
return y;
if(y==0)
return x;
}
int aint[270000][105];
int lazy[270000][105];
void build(int nod, int st, int dr, int c)
{
aint[nod][c] = INF;
lazy[nod][c] = INF;
if(st==dr)
return;
int mij=(st+dr)/2;
build(nod*2,st,mij,c);
build(nod*2+1,mij+1,dr,c);
}
void propagate(int nod, int c)
{
if(lazy[nod][c]==INF)
return;
aint[nod*2][c] = min(aint[nod*2][c], lazy[nod][c]);
lazy[nod*2][c] = min(lazy[nod*2][c], lazy[nod][c]);
aint[nod*2+1][c] = min(aint[nod*2+1][c], lazy[nod][c]);
lazy[nod*2+1][c] = min(lazy[nod*2+1][c], lazy[nod][c]);
lazy[nod][c]=INF;
}
void upd(int nod, int st, int dr, int le, int ri, int newv, int c)
{
if(le>ri)
return;
if(le==st && dr==ri)
{
if(aint[nod][c]>newv)
{
aint[nod][c]=newv;
lazy[nod][c]=newv;
}
return;
}
propagate(nod,c);
int mij=(st+dr)/2;
upd(nod*2,st,mij,le,min(mij,ri),newv,c);
upd(nod*2+1,mij+1,dr,max(mij+1,le),ri,newv,c);
aint[nod][c] = min(aint[nod*2][c],aint[nod*2+1][c]);
}
int qry(int nod, int st, int dr, int le, int ri, int c)
{
if(le>ri)
return INF;
if(le==st && dr==ri)
return aint[nod][c];
propagate(nod,c);
int mij=(st+dr)/2;
return min(qry(nod*2,st,mij,le,min(mij,ri),c),
qry(nod*2+1,mij+1,dr,max(mij+1,le),ri,c));
}
signed main()
{
cin>>n>>k;
deque<int> dq;
for(int i=1;i<=n;i++)
{
cin>>a[i];
while(!dq.empty() && a[dq.back()]<=a[i])
dq.pop_back();
if(dq.empty())
tole[i]=0;
else
tole[i]=dq.back();
dq.push_back(i);
}
dq.clear();
for(int i=n;i>0;i--)
{
while(!dq.empty() && a[dq.back()]<=a[i])
dq.pop_back();
if(dq.empty())
tori[i]=n+1;
else
tori[i]=dq.back();
dq.push_back(i);
}
for(int i=1;i<=k;i++)
build(1,0,n,i);
int mxm=0;
for(int i=1;i<=n;i++)
{
mxm = max(mxm,a[i]);
upd(1,0,n,i,i,mxm,1);
}
for(int i=1;i<=n;i++)
{
//cout<<i<<" "<<tole[i]<<" "<<tori[i]<<" zzz\n";
for(int j=2;j<=k;j++)
{
//if(dp[tole[i]][j-1]==INF)
// continue;
//cout<<i<<" "<<j<<" zzz\n";
// dp[tori[i]-1][j] = min(dp[tori[i]-1][j], dp[tole[i]][j-1] + a[i]);
int aux = INF;
//for(int x=tole[i];x<i;x++)
// aux = min(aux, dp[x][j-1]);
aux = qry(1,0,n,tole[i],i-1,j-1);
//for(int x=i;x<tori[i];x++)
// dp[x][j] = min(dp[x][j], aux + a[i]);
upd(1,0,n,i,tori[i]-1,aux+a[i],j);
}
}
cout<<qry(1,0,n,n,n,k);
return 0;
}
/**
10 5
1 9 1 9 1 9 1 9 1 9
*/
Compilation message (stderr)
blocks.cpp: In function 'int mymin(int, int)':
blocks.cpp:15:1: warning: control reaches end of non-void function [-Wreturn-type]
15 | }
| ^
# | 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... |