Submission #514846

#TimeUsernameProblemLanguageResultExecution timeMemory
514846Be_dosDivide and conquer (IZhO14_divide)C++17
48 / 100
1077 ms2440 KiB
#include <iostream> #include <cmath> #include <cctype> #include <vector> #include <algorithm> #include <set> #include <map> #include <deque> #include <stack> #include <unordered_set> #include <sstream> #include <cstring> #include <iomanip> #include <queue> #include <unordered_map> #include <random> #include <cfloat> #include <chrono> #include <bitset> #include <complex> #include <immintrin.h> #include <cassert> struct Point { int32_t x; int32_t gold, energy; }; struct Node { Node* left = nullptr, *right = nullptr; int32_t priority; int64_t key; int32_t value; int32_t min_value; Node(int64_t key_, int32_t value_) { key = key_; value = value_; min_value = value; } }; void recalc(Node* node) { node->min_value = node->value; if(node->left != nullptr) node->min_value = std::min(node->min_value, node->left->min_value); if(node->right != nullptr) node->min_value = std::min(node->min_value, node->right->min_value); } std::pair<Node*, Node*> split(Node* node, int64_t x) { if(node == nullptr) return {nullptr, nullptr}; if(node->key < x) { std::pair<Node*, Node*> res = split(node->right, x); node->right = res.first; recalc(node); return {node, res.second}; } else { std::pair<Node*, Node*> res = split(node->left, x); node->left = res.second; recalc(node); return {res.first, node}; } } Node* merge(Node* node1, Node* node2) { if(node1 == nullptr) return node2; if(node2 == nullptr) return node1; if(node1->priority < node2->priority) { node1->right = merge(node1->right, node2); recalc(node1); return node1; } else { node2->left = merge(node1, node2->left); recalc(node2); return node2; } } int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); int32_t n; std::cin >> n; Point* points = new Point[n]; for(int32_t i = 0; i < n; i++) std::cin >> points[i].x >> points[i].gold >> points[i].energy; int64_t* pref_sum = new int64_t[n + 1]; pref_sum[0] = 0; for(int32_t i = 1; i <= n; i++) pref_sum[i] = pref_sum[i - 1] + points[i - 1].energy; int64_t* gold_pref_sum = new int64_t[n + 1]; gold_pref_sum[0] = 0; for(int32_t i = 1; i <= n; i++) gold_pref_sum[i] = gold_pref_sum[i - 1] + points[i - 1].gold; int64_t ans = 0; Node* root = nullptr; for(int32_t i = 0; i < n; i++) { std::pair<Node*, Node*> parts = split(root, points[i].x - pref_sum[i]); root = merge(merge(parts.first, new Node(points[i].x - pref_sum[i], i)), parts.second); int64_t val = points[i].x - pref_sum[i + 1]; parts = split(root, val); ans = std::max(ans, gold_pref_sum[i + 1] - gold_pref_sum[parts.second->min_value]); root = merge(parts.first, parts.second); } std::cout << ans; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...