제출 #883702

#제출 시각아이디문제언어결과실행 시간메모리
883702alexddK개의 묶음 (IZhO14_blocks)C++17
53 / 100
1048 ms222120 KiB
#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
*/

컴파일 시 표준 에러 (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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...