# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
555703 |
2022-05-01T11:21:38 Z |
urosk |
K blocks (IZhO14_blocks) |
C++14 |
|
1 ms |
340 KB |
// __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 100000000000000000LL // 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];
ll dp[maxn];
ll ndp[maxn];
ll st[maxn][lg];
ll powi[maxn];
ll get(ll l,ll r){
ll len = (r-l+1);
ll k = powi[len];
ll ans = max(st[l][k],st[r-(1<<k)+1][k]);
return ans;
}
void reshi(ll l,ll r,ll optl,ll optr){
if(l>r) return;
if(optl>optr) return;
ll mid = (l+r)/2;
ndp[mid] = ndp[mid-1] + a[mid];
ll opt = mid-1;
for(ll i = optl;i<=min(optr,mid-1);i++){
if(dp[i] + get(i+1,mid) < ndp[mid]){
opt = i;
ndp[mid] = dp[i] + get(i+1,mid);
}
}
//cerr<<l<< " "<<r<< " "<<optl<< " "<<optr<<" "<<mid<< " "<<opt<<endl;
reshi(l,mid-1,opt,optr);
reshi(mid+1,r,optl,opt);
}
ll brut(){
vector<vector<ll> > v(n+1,vector<ll>(k+1,0));
v[0][0] = 0;
for(ll i = 1;i<=n;i++) v[i][0] = llinf;
for(ll j = 1;j<=k;j++){
for(ll i = 1;i<=n;i++){
v[i][j] = llinf;
ll mx = a[i];
for(ll f = i-1;f>=0;f--){
v[i][j] = min(v[i][j],v[f][j-1] + mx);
mx = max(mx,a[f]);
}
}
if(j==1) v[0][0] = llinf;
}
return v[n][k];
}
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];
for(ll i = 1;i<=n;i++) st[i][0] = a[i];
for(ll j = 1;j<lg;j++){
for(ll i = 1;i+(1<<j)-1<=n;i++){
st[i][j] = max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
}
for(ll j = 0;j<lg;j++){
if((1<<j)>n) break;
powi[(1<<j)] = j;
}
for(ll i = 1;i<=n;i++){
if(powi[i]==0) powi[i] = powi[i-1];
}
fill(dp,dp+n+1,llinf);
dp[0] = 0;
for(ll ii = 1;ii<=k;ii++){
fill(ndp,ndp+n+1,llinf);
//here;
reshi(1,n,0,n);
//cerr<<"dp: ";
for(ll i = 1;i<=n;i++) dp[i] = ndp[i];
for(ll i = 0;i<ii;i++) dp[i] = llinf;
//ceri(ndp,0,n);
}
cout<<dp[n]<<endl;
//cerr<<"brut: "<<brut()<<endl;
return 0;
}
/*
5 2
1 2 3 4 5
out: 5
*/
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
340 KB |
Output is correct |
2 |
Correct |
0 ms |
340 KB |
Output is correct |
3 |
Correct |
0 ms |
340 KB |
Output is correct |
4 |
Incorrect |
0 ms |
340 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
340 KB |
Output is correct |
2 |
Correct |
0 ms |
340 KB |
Output is correct |
3 |
Correct |
0 ms |
340 KB |
Output is correct |
4 |
Incorrect |
0 ms |
340 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
340 KB |
Output is correct |
2 |
Correct |
0 ms |
340 KB |
Output is correct |
3 |
Correct |
0 ms |
340 KB |
Output is correct |
4 |
Incorrect |
0 ms |
340 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
0 ms |
340 KB |
Output is correct |
2 |
Correct |
0 ms |
340 KB |
Output is correct |
3 |
Correct |
0 ms |
340 KB |
Output is correct |
4 |
Incorrect |
0 ms |
340 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |