Submission #1088686

#TimeUsernameProblemLanguageResultExecution timeMemory
1088686xnqsDivide and conquer (IZhO14_divide)C++17
100 / 100
22 ms7040 KiB
#include <iostream> #include <fstream> #include <vector> #include <queue> #include <utility> #include <algorithm> #include <map> #include <unordered_map> #include <cstring> int x; int diff_coords[100005]; int coords[100005]; int arr1[100005]; int arr2[100005]; int64_t pfx2[100005]; int64_t pfx3[100005]; int64_t pfx_min[100005]; int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); std::cin >> x; for (int i = 1; i <= x; i++) { int a, b, c; std::cin >> a >> b >> c; coords[i] = a; diff_coords[i-1] = coords[i] - coords[i-1]; arr1[i] = c; arr2[i] = b; pfx2[i] = pfx2[i-1] + arr2[i]; } pfx_min[0] = 0x3f3f3f3f3f3f3f3f; for (int i = 1; i <= x; i++) { pfx3[i] = pfx3[i-1] + arr1[i] - diff_coords[i]; pfx_min[i] = std::min(pfx_min[i-1], pfx3[i]); } int64_t ans = 0; // case 1: individual elements for (int i = 1; i <= x; i++) { ans = std::max(ans, (int64_t)arr2[i]); } // case 2: sequences of two or more elements int64_t base_gold = arr2[1]; int64_t base_diff = arr1[1]; for (int i = 2; i <= x; i++) { base_gold += arr2[i]; base_diff += arr1[i]; base_diff -= diff_coords[i-1]; if (base_diff>=0) { ans = std::max(ans, base_gold); continue; } int64_t gold = base_gold; int64_t diff = base_diff; // binary search for minimum position where sum is <= base_diff const auto bs = [&]() { int ret = i; int l = 1, r = i-1; while (l<=r) { int m = (l+r)>>1; if (pfx_min[m]<=base_diff) { ret = m; r = m-1; } else { l = m+1; } } return ret; }; int pos = bs(); if (pos==i) { continue; } gold -= pfx2[pos]; ans = std::max(ans,gold); } std::cout << ans << "\n"; }

Compilation message (stderr)

divide.cpp: In function 'int main()':
divide.cpp:62:11: warning: unused variable 'diff' [-Wunused-variable]
   62 |   int64_t diff = base_diff;
      |           ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...