Submission #556242

#TimeUsernameProblemLanguageResultExecution timeMemory
556242uroskK blocks (IZhO14_blocks)C++14
0 / 100
1 ms340 KiB
// __builtin_popcount(x) // __builtin_popcountll(x) #define here cerr<<"===========================================\n" #include <bits/stdc++.h> #define ld double #define ll long long #define ull unsigned long long #define llinf 1000000000000000LL // 10^17 #define iinf 2000000000 // 2*10^9 #define pb push_back #define popb pop_back #define fi first #define sc second #define endl '\n' #define pii pair<int,int> #define pll pair<ll,ll> #define pld pair<ld,ld> #define sz(a) int(a.size()) #define all(a) a.begin(),a.end() #define ceri(a,l,r) {for(ll i_ = l;i_<=r;i_++) cerr<<a[i_]<< " ";cerr<<endl;} using namespace std; #define maxn 100005 #define maxk 105 #define lg 25 ll n,k; ll a[maxn]; bool pisi = 1; ll st[maxn][lg]; ll powi[maxn]; bool test = 0; ll get(ll l,ll r){ ll len = (r-l+1); ll k = powi[len]; ll ans = min(st[l][k],st[r-(1<<k)+1][k]); return ans; } ll b[maxn]; ll dp[2][maxn]; ll dpmin[2][maxn]; int main(){ ios_base::sync_with_stdio(false);cerr.tie(0);cout.tie(0);cin.tie(0); cin >> n >> k; for(ll i = 1;i<=n;i++) cin >> a[i]; stack<ll> ste; for(ll i = 1;i<=n;i++){ while(sz(ste)&&a[i]>=a[ste.top()]) ste.pop(); if(sz(ste)) b[i] = ste.top(); } for(ll j = 0;(1<<j)<=n+1;j++) powi[1<<j] = j; for(ll i = 1;i<=n+1;i++) if(powi[i]==0) powi[i] = powi[i-1]; fill(dp[0],dp[0]+n+1,llinf); dp[0][0] = 0; for(ll i = 0;i<=n;i++) st[i][0] = dp[0][i]; for(ll j = 1;j<lg;j++){ for(ll i = 0;i+(1<<j)-1<=n;i++){ st[i][j] = min(st[i][j-1],st[i+(1<<(j-1))-1][j-1]); } } for(ll j = 1;j<=k;j++){ dp[j&1][0] = llinf; for(ll i = 1;i<=n;i++){ if(b[i]==0){ dp[j&1][i] = get(0,i-1) + a[i]; }else{ dp[j&1][i] = min(get(b[i]+1,i-1)+a[i],dp[j&1][b[i]]); } } for(ll i = 0;i<=n;i++) dp[(j&1)^1][i] = dp[j&1][i]; for(ll i = 0;i<=n;i++) st[i][0] = dp[j&1][i]; for(ll e = 1;e<lg;e++){ for(ll i = 0;i+(1<<e)-1<=n;i++){ st[i][e] = min(st[i][e-1],st[i+(1<<(e-1))-1][e-1]); } } } cout<<dp[k&1][n]<<endl; return 0; } /* 5 1 1 2 3 4 5 out: 5 5 2 1 2 3 4 5 out: 6 5 4 3 1 3 5 1 out: 10 7 4 10 7 4 1 8 4 1 10 5 5 9 2 9 4 6 9 3 7 8 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...