Submission #421333

#TimeUsernameProblemLanguageResultExecution timeMemory
421333timmyfengMeetings (IOI18_meetings)C++17
0 / 100
52 ms6228 KiB
#include <bits/stdc++.h> using namespace std; #include "meetings.h" const int N = 750000, L = __lg(N) + 1; long long mini_l[L][N], mini_r[L][N], sum_l[L][N], sum_r[L][N]; int par_l[L][N], par_r[L][N]; vector<int> h; void calc(int i, int l) { if (par_r[i][l] != -1 || i == 0) { return; } calc(i - 1, l); int p = par_r[i - 1][l]; if (p == -1) { return; } calc(i - 1, p); par_r[i][l] = par_r[i - 1][p]; sum_r[i][l] = sum_r[i - 1][l] + sum_r[i - 1][p]; mini_r[i][l] = min( (long long) h[p] * (p - l) + mini_r[i - 1][p], mini_r[i - 1][l] + sum_r[i - 1][p] ); } vector<long long> minimum_costs(vector<int> h, vector<int> l, vector<int> r) { int n = h.size(), q = l.size(); ::h = h; for (int i = 0; i <= __lg(n); ++i) { for (int j = 0; j < n; ++j) { par_l[i][j] = par_r[i][j] = -1; sum_l[i][j] = sum_r[i][j] = 0; mini_l[i][j] = mini_r[i][j] = 0; } } vector<int> stk; for (int r = 0; r < n; ++r) { while (!stk.empty() && h[stk.back()] <= h[r]) { int l = stk.back(); stk.pop_back(); int u = r - 1; long long mini = 0; for (int i = __lg(n); i >= 0; --i) { if (par_l[i][u] >= l) { mini = min( (long long) h[u] * (r - 1 - u) + mini_l[i][u], mini + sum_l[i][u] ); u = par_l[i][u]; } } mini += h[l]; par_r[0][l] = r; mini_r[0][l] = mini; sum_r[0][l] = (long long) h[l] * (r - l); } if (!stk.empty()) { int l = stk.back(); int u = l + 1; long long mini = 0; for (int i = __lg(n); i >= 0; --i) { calc(i, u); if (par_r[i][u] != -1) { mini = min( (long long) h[u] * (u - l - 1) + mini_r[i][u], mini + sum_r[i][u] ); u = par_r[i][u]; } } mini += h[r]; par_l[0][r] = l; mini_l[0][r] = mini; sum_l[0][r] = (long long) h[r] * (r - l); for (int i = 1; i <= __lg(n); ++i) { int p = par_l[i - 1][r]; if (p != -1) { par_l[i][r] = par_l[i - 1][p]; sum_l[i][r] = sum_l[i - 1][r] + sum_l[i - 1][p]; mini_l[i][r] = min( (long long) h[p] * (r - p) + mini_l[i - 1][p], mini_l[i - 1][r] + sum_l[i - 1][p] ); } } } stk.push_back(r); } vector<long long> c(q); for (int i = 0; i < q; ++i) { int u = l[i]; long long left = 0; for (int j = __lg(n); j >= 0; --j) { calc(j, u); int p = par_r[j][u]; if (p != -1 && p <= r[i]) { left = min( (long long) h[u] * (u - l[i]) + mini_r[j][u], left + sum_r[j][u] ); u = p; } } left += (long long) (r[i] - u + 1) * h[u]; u = r[i]; long long right = 0; for (int j = __lg(n); j >= 0; --j) { int p = par_l[j][u]; if (p >= l[i]) { right = min( (long long) h[u] * (r[i] - u) + mini_l[j][u], right + sum_l[j][u] ); u = p; } } right += (long long) (u - l[i] + 1) * h[u]; c[i] = min(left, right); } return c; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...