Submission #219738

#TimeUsernameProblemLanguageResultExecution timeMemory
219738atoizConstellation 3 (JOI20_constellation3)C++14
100 / 100
1047 ms51704 KiB
/*input 8 6 8 5 7 3 4 2 1 10 8 2 9 6 6 7 8 3 18 5 8 17 8 5 3 5 5 3 5 4 8 1 8 13 1 7 5 7 4 13 */ #include <iostream> #include <vector> #include <algorithm> #include <cassert> #include <tuple> #include <map> #include <numeric> using namespace std; void maximize(int64_t &x, int64_t y) { x = (x > y ? x : y); } struct FenwickTree { int N; vector<int64_t> A; FenwickTree(int _N): N(_N + 3), A(N, 0) {}; void add(int l, int r, int64_t x) { l += 1, r += 2; for (; l <= N; l += l & (-l)) A[l] += x; for (; r <= N; r += r & (-r)) A[r] -= x; } int64_t get(int id) { int64_t val = 0; for (id += 1; id > 0; id -= id & (-id)) val += A[id]; return val; } }; using point_t = tuple<int, int, int>; const int MAXN = 200006, LOG = __lg(MAXN) + 1; int N, M, A[MAXN]; int nxt_lef[MAXN], nxt_rig[MAXN]; int jump_lef[LOG][MAXN], jump_rig[LOG][MAXN]; int64_t total_C = 0; map<pair<int, int>, vector<point_t>> points; vector<int> ids; #define less less_ bool less(int i, int j) { return make_pair(A[i], i) < make_pair(A[j], j); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for (int i = 1; i <= N; ++i) cin >> A[i]; A[0] = A[N + 1] = MAXN; nxt_lef[0] = 0, nxt_rig[N + 1] = N + 1; for (int i = 1; i <= N; ++i) { for (nxt_lef[i] = i - 1; less(nxt_lef[i], i); nxt_lef[i] = nxt_lef[nxt_lef[i]]); } for (int i = N; i >= 1; --i) { for (nxt_rig[i] = i + 1; less(nxt_rig[i], i); nxt_rig[i] = nxt_rig[nxt_rig[i]]); } jump_lef[0][0] = 0, jump_rig[0][N + 1] = N + 1; for (int i = 1; i <= N; ++i) jump_lef[0][i] = nxt_lef[i], jump_rig[0][i] = nxt_rig[i]; for (int j = 1; j < LOG; ++j) for (int i = 0; i <= N + 1; ++i) { jump_lef[j][i] = jump_lef[j - 1][jump_lef[j - 1][i]]; jump_rig[j][i] = jump_rig[j - 1][jump_rig[j - 1][i]]; } cin >> M; while (M--) { int x, y, c; cin >> x >> y >> c; int l = x, r = x; for (int j = LOG - 1; j >= 0; --j) { if (A[jump_lef[j][l]] < y) l = jump_lef[j][l]; if (A[jump_rig[j][r]] < y) r = jump_rig[j][r]; } l = nxt_lef[l], r = nxt_rig[r]; points[make_pair(l, r)].emplace_back(x, y, c); total_C += c; } FenwickTree bit_l(N + 2), bit_r(N + 2); ids.resize(N); iota(ids.begin(), ids.end(), 1); sort(ids.begin(), ids.end(), less); for (int mid : ids) { int lef = nxt_lef[mid], rig = nxt_rig[mid]; int64_t val_lef = bit_r.get(lef), val_rig = bit_l.get(rig); int64_t cur = val_lef + val_rig, val = cur; bit_r.add(lef, mid - 1, val_rig); bit_l.add(mid + 1, rig, val_lef); if (points.find(make_pair(lef, rig)) != points.end()) { for (auto point : points[make_pair(lef, rig)]) { int x, y, c; tie(x, y, c) = point; assert(y > A[mid] && y <= A[lef] && y <= A[rig]); assert(lef < x && x < rig); maximize(val, c + bit_l.get(x) + bit_r.get(x)); } } bit_r.add(lef, lef, val - cur); bit_l.add(rig, rig, val - cur); } cout << total_C - bit_r.get(0) << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...