이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<iostream>
#include<deque>
using namespace std;
const int INF = 1e9;
int n,k;
int a[100005];
int tole[100005];
int tori[100005];
int aint[270000][105];
int lazy[270000][105];
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()
{
ios_base::sync_with_stdio(0);cin.tie(0);
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);
}
int mxm=0;
for(int i=1;i<=n;i++)
{
mxm = max(mxm,a[i]);
upd(1,0,n,i,i,mxm-INF,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]);
//for(int x=tole[i];x<i;x++)
// aux = min(aux, dp[x][j-1]);
int aux = qry(1,0,n,tole[i],i-1,j-1) + INF;
//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]-INF,j);
}
}
cout<<qry(1,0,n,n,n,k) + INF;
return 0;
}
/**
10 5
1 9 1 9 1 9 1 9 1 9
*/
# | 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... |