Submission #883707

#TimeUsernameProblemLanguageResultExecution timeMemory
883707alexddK개의 묶음 (IZhO14_blocks)C++17
53 / 100
1030 ms216980 KiB
#include<iostream> #include<deque> #pragma GCC optimize("O3,unroll-loops") 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]); if(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]); if(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++) { for(int j=2;j<=k;j++) { upd(1,0,n,i,tori[i]-1,qry(1,0,n,tole[i],i-1,j-1)+a[i],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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...