제출 #171790

#제출 시각아이디문제언어결과실행 시간메모리
171790davitmargK개의 묶음 (IZhO14_blocks)C++17
53 / 100
1000 ms117204 KiB
/*DavitMarg*/ #include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <string> #include <cstring> #include <map> #include <unordered_map> #include <set> #include <queue> #include <iomanip> #include <bitset> #include <stack> #include <cassert> #include <iterator> #include <fstream> #define mod 1000000007ll #define LL long long #define LD long double #define MP make_pair #define PB push_back #define all(v) v.begin(), v.end() using namespace std; const int N = 100005; int n, k; LL a[N], lst[N], dp[N][105]; LL t[105][4 * N]; void build(int k, int v, int l, int r) { t[k][v] = mod * mod; if (l != r) { int m = (l + r) / 2; build(k, v * 2, l, m); build(k, v * 2 + 1, m + 1, r); } } void upd(int k, int v, int l, int r, int pos, LL val) { if (l == r) { t[k][v] = min(val, t[k][v]); return; } int m = (l + r) / 2; if (pos <= m) upd(k, v * 2, l, m, pos, val); else upd(k, v * 2 + 1, m + 1, r, pos, val); t[k][v] = min(t[k][v * 2], t[k][v * 2 + 1]); } LL get(int k, int v, int l, int r, int i, int j) { if (i > j) return mod * mod; if (l == i && r == j) return t[k][v]; int m = (l + r) / 2; return min( get(k, v * 2, l, m, i, min(j, m)), get(k, v * 2 + 1, m + 1, r, max(i, m + 1), j)); } vector<int> s; int main() { cin >> n >> k; for (int i = 1; i <= n; i++) scanf("%lld", a + i); a[0] = mod; s.PB(0); for (int i = 1; i <= n; i++) { while (a[s.back()] <= a[i]) s.pop_back(); lst[i] = s.back(); s.PB(i); } for (int i = 0; i <= n; i++) for (int j = 0; j <= k; j++) dp[i][j] = mod * mod; for (int j = 0; j <= k; j++) build(j, 1, 0, n); dp[0][0] = 0; upd(0, 1, 0, n, 0, 0); for (int i = 1; i <= n; i++) for (int j = 1; j <= k; j++) { dp[i][j] = min(dp[i][j], dp[lst[i]][j]); // for (int x = i; x > lst[i]; x--) // dp[i][j] = min(dp[i][j], dp[x - 1][j - 1] + a[i]); dp[i][j] = min(dp[i][j], get(j - 1, 1, 0, n, lst[i], i - 1) + a[i]); upd(j, 1, 0, n, i, dp[i][j]); } cout << dp[n][k] << endl; return 0; } /* 2 4 9 10 5 4 5 5 */

컴파일 시 표준 에러 (stderr) 메시지

blocks.cpp: In function 'int main()':
blocks.cpp:75:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%lld", a + i);
         ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...