Submission #790131

#TimeUsernameProblemLanguageResultExecution timeMemory
790131n3rm1nStove (JOI18_stove)C++17
50 / 100
1077 ms3608 KiB
/// note: it's actually stove #include<bits/stdc++.h> #define endl '\n' using namespace std; const long long MAXN = 1e5 + 10; void speed() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); } long long n, k, a[MAXN]; void read() { cin >> n >> k; for (long long i = 1; i <= n; ++ i) cin >> a[i]; } vector < long long > before(MAXN), dp(MAXN); long long inf = 1e15+10; long long q = 0; void divide(long long l, long long r, long long opt_left, long long opt_right) { if(l > r)return; //cout << l << " " << r << endl; long long mid = (l + r)/2; dp[mid] = inf; long long best = inf, best_opt = -1; long long cost; for (long long cut = opt_left; cut <= min(mid, opt_right); ++ cut) { cost = before[cut-1] + a[mid] - a[cut] + 1; /* if(q == 2) { cout << "**" << endl; cout << l << " " << r << " --> " << mid << endl; cout << "cut on " << cut << endl; cout << cost << endl; }*/ if(cost < best) { best = cost; best_opt = cut; } } dp[mid] = best; //cout << q << " " << mid << " " << best << endl; divide(l, mid-1, opt_left, best_opt); divide(mid+1, r, best_opt, opt_right); } void solve() { dp[0] = 0; for (long long i = 1; i <= n; ++ i) dp[i] = inf; for (long long i = 1; i <= k; ++ i) { q = i; before = dp; divide(1, n, 1, n); } cout << dp[n] << endl; } int main() { // speed(); read(); solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...