Submission #171835

#TimeUsernameProblemLanguageResultExecution timeMemory
171835davitmargK개의 묶음 (IZhO14_blocks)C++17
53 / 100
526 ms262144 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; char readchar() { char c = getchar(); while (c <= 33) { c = getchar(); } return c; } int readint() { char c = getchar(); while (c <= 33) { c = getchar(); } bool sign = false; if (c == '-') { sign = true; c = getchar(); } int t = 0; while (c >= '0' && c <= '9') { t = (t << 3) + (t << 1) + c - '0'; c = getchar(); } return (sign ? -t : t); } const int N = 100005; int n, k, LOG[N]; LL a[N], lst[N], dp[N][105]; LL sp[101][N][18]; LL get(int k, int l, int r) { int j = LOG[r - l + 1]; //cout << k << " : " << l << " : " << r << " = " << min(sp[k][r][j], sp[k][l + (1 << j) - 1][j]) << endl; return min(sp[k][r][j], sp[k][l + (1 << j) - 1][j]); } vector<int> s; int main() { cin >> n >> k; for (int i = 1; i <= n; i++) a[i] = readint(); LOG[1] = 0; for (int i = 2; i <= n; i++) LOG[i] = LOG[i / 2] + 1; 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; dp[0][0] = 0; for (int j = 0; j <= k; j++) for (int x = 0; x <= LOG[n]; x++) sp[j][0][x] = mod * mod; sp[0][0][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]); dp[i][j] = min(dp[i][j], get(j - 1, lst[i], i - 1) + a[i]); } for (int j = 0; j <= k; j++) { sp[j][i][0] = dp[i][j]; for (int x = 1; x <= LOG[n]; x++) { sp[j][i][x] = sp[j][i][x - 1]; if (i - (1 << (x - 1)) >= 0) sp[j][i][x] = min(sp[j][i][x], sp[j][i - (1 << (x - 1))][x - 1]); } } } cout << dp[n][k] << endl; return 0; } /* 2 4 9 10 5 4 5 5 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...