Submission #210728

#TimeUsernameProblemLanguageResultExecution timeMemory
210728nafis_shifatK blocks (IZhO14_blocks)C++14
0 / 100
13 ms2552 KiB
#include<bits/stdc++.h> #define pii pair<int,int> #define ll long long using namespace std; const int inf=1e9; const int mxn=1e5+9; int tree[4*mxn]={}; int pnt; void query(int node,int b,int e,int v) { if(b==e) { pnt=min(pnt,b); return; } int mid=b+e>>1; int left=node<<1; int right=left|1; if(tree[right]<=v) { pnt=min(pnt,mid+1); query(left,b,mid,v); } else { query(right,mid+1,e,v); } } void update(int node, int b,int e,int p,int v) { if(b>p||e<p)return; if(b==e) { tree[node]=v; return; } int m=b+e>>1; int l=node<<1; int r=l|1; update(l,b,m,p,v); update(r,m+1,e,p,v); tree[node]=max(tree[l],tree[r]); } int main() { int n,k; cin>>n>>k; int a[n+1]; for(int i=1;i<=n;i++)cin>>a[i]; int dp[n+1][k+1]; dp[1][1]=a[1]; int mx[n+1][k+1]; mx[1][1]=a[1]; for(int i=2;i<=k;i++)dp[1][i]=inf,mx[1][i]=0; for(int i=2;i<=n;i++) { dp[i][1]=max(dp[i-1][1],a[i]); mx[i][1]=dp[i][1]; update(1,1,mxn,i,a[i]); pnt=i; query(1,1,mxn,a[i]); for(int j=2;j<=k;j++) { int l=max(pnt-1,j-1); int v1=dp[i-1][l]+a[i]; int v2=dp[i-1][j]-mx[i-1][j]+max(mx[i-1][j],a[i]); if(v1<v2) { dp[i][j]=v1; mx[i][j]=a[i]; } else { dp[i][j]=v2; mx[i][j]=max(mx[i-1][j],a[i]); } } } cout<<dp[n][k]<<endl; return 0; }

Compilation message (stderr)

blocks.cpp: In function 'void query(int, int, int, int)':
blocks.cpp:16:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int mid=b+e>>1;
          ~^~
blocks.cpp: In function 'void update(int, int, int, int, int)':
blocks.cpp:38:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
     int m=b+e>>1;
           ~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...