제출 #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...