Advertisement
ivnikkk

Untitled

Dec 30th, 2022
1,038
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.33 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "bits/stdc++.h"
  3. using namespace std;
  4. #define all(a) a.begin(), a.end()
  5. const int mxn = 1e5 + 3;
  6. struct BIT {
  7.   int tree[mxn] = {};
  8.   void upd(int r, int x) {
  9.     for (; r < mxn; r += r & -r) {
  10.       tree[r] += x;
  11.     }
  12.   }
  13.   int get(int r) {
  14.     int res = 0;
  15.     for (; r > 0; r -= r & -r) {
  16.       res += tree[r];
  17.     }
  18.     return res;
  19.   }
  20.   int sum(int l, int r) {
  21.     return get(r) - get(l - 1);
  22.   }
  23.   int kth(int k, int s) {
  24.     swap(k, s);
  25.     k += get(s - 1);
  26.     s = 0;
  27.     for (int i = 20; i >= 0; i--) {
  28.       if (s + (1ll << i) < mxn && tree[s + (1ll << i)] < k) {
  29.         s += (1ll << i);
  30.         k -= tree[s];
  31.       }
  32.     }
  33.     return s + 1;
  34.   }
  35. };
  36.  
  37. signed main() {
  38. #ifdef _DEBUG
  39.   freopen("input.txt", "r", stdin);
  40.   freopen("output.txt", "w", stdout);
  41. #endif
  42.   ios_base::sync_with_stdio(false);
  43.   cin.tie(nullptr);
  44.   int n, k; cin >> n >> k;
  45.   vector<pair<int, int>> a(n);
  46.   vector<int> next(n + 3), last(n + 3);
  47.   BIT T;
  48.   for (int i = 0; i < n; i++) {
  49.     cin >> a[i].first;
  50.     a[i].second = i + 1;
  51.     T.upd(i + 1, 1);
  52.     next[i + 1] = i + 2;
  53.     last[i + 1] = i;
  54.   }
  55.   next[0] = 1;
  56.   last[n + 1] = n;
  57.   next[n + 1] = n + 2;
  58.   last[n + 2] = n + 1;
  59.   T.upd(n + 1, 1);
  60.   T.upd(n + 2, 1);
  61.   long long ans = 0;
  62.   sort(all(a));
  63.   for (int i = 0; i <= n - k; i++) {
  64.     int sub_k = k;
  65.     int cnt_bad = T.sum(1, a[i].second);
  66.     int left_1 = 0, left_2 = 1, right_1 = a[i].second, right_2 = T.kth(a[i].second + 1, 1);
  67.     if (cnt_bad <= sub_k) {
  68.       sub_k -= cnt_bad;
  69.       left_2 = T.kth(1, 1);
  70.       if (sub_k) {
  71.         right_1 = T.kth(a[i].second + 1, sub_k);
  72.         right_2 = T.kth(right_1 + 1, 1);
  73.       }
  74.     }
  75.     else {
  76.       left_1 = T.kth(1, cnt_bad - sub_k);
  77.       left_2 = T.kth(left_1 + 1, 1);
  78.     }
  79.     while (1) {
  80.       long long segs = (long long)(left_2 - left_1) * (long long)(right_2 - right_1);
  81.       ans += (segs * a[i].first);
  82.       if (right_2 == n + 1) {
  83.         break;
  84.       }
  85.       swap(right_1, right_2);
  86.       right_2 = next[right_1];
  87.       swap(left_1, left_2);
  88.       if (left_1 == a[i].second) {
  89.         break;
  90.       }
  91.       left_2 = next[left_1];
  92.     }
  93.     T.upd(a[i].second, -1);
  94.     next[last[a[i].second]] = next[a[i].second];
  95.     last[next[a[i].second]] = last[a[i].second];
  96.   }
  97.   cout << ans;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement