Mivik

sayounara.cpp

Jan 31st, 2022
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.39 KB | None | 0 0
  1.  
  2. #include <cstdint>
  3. #include <vector>
  4. #include <cassert>
  5. #include <iostream>
  6.  
  7. uint64_t query(int l, int r);
  8. uint32_t get(int x);
  9.  
  10. namespace {
  11.  
  12. const int $n = 1000005;
  13.  
  14. int n;
  15.  
  16. uint64_t f(int x) {
  17.     static bool has[$n];
  18.     static uint64_t c[$n];
  19.     if (has[x]) return c[x]; has[x] = 1;
  20.     return c[x] = query(1, x) + query(x + 1, n);
  21. }
  22.  
  23. template<class T, class F>
  24. inline T first_that(T l, T r, F &&pred) {
  25.     assert(l <= r); T ret = r + 1;
  26.     while (l <= r) {
  27.         const T mid = (l + r) >> 1;
  28.         if (pred(mid)) r = (ret = mid) - 1;
  29.         else l = mid + 1;
  30.     }
  31.     return ret;
  32. }
  33. }
  34.  
  35. std::vector<uint32_t> recover(int n) {
  36.     ::n = n;
  37.     int l = 1, r = n - 1;
  38.     while (f(l) != f(r)) {
  39.         int m = (l + r) >> 1;
  40.         auto s = f(m);
  41.         if (s == f(r)) {
  42.             int t = first_that(l, m - 1, [s](int d) { return f(d) == s; });
  43.             if (t == 1 || f(t - 1) > s) r = t - 1; else l = t;
  44.         } else {
  45.             int t = first_that(m + 1, r, [s](int d) { return f(d) != s; });
  46.             if (t == n || f(t) < s) r = t - 1; else l = t;
  47.         }
  48.     }
  49.     auto A = get(l), B = get(r + 1);
  50.     int mp = (A < B)? l: (r + 1);
  51.     std::vector<uint32_t> ans(n);
  52.     ans[mp - 1] = std::min(A, B);
  53.     uint64_t last = 0;
  54.     for (int i = mp - 1; i; --i) {
  55.         uint64_t cur = query(i, mp);
  56.         ans[i - 1] = cur - last;
  57.         last = cur;
  58.     }
  59.     last = 0;
  60.     for (int i = mp + 1; i <= n; ++i) {
  61.         uint64_t cur = query(mp, i);
  62.         ans[i - 1] = cur - last;
  63.         last = cur;
  64.     }
  65.     return ans;
  66. }
  67.  
Advertisement
Add Comment
Please, Sign In to add comment