Advertisement
Guest User

Juanzhang

a guest
Jun 5th, 2019
224
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.47 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxn = 5e5 + 10;
  5. int n, k, L, R, sum[maxn];
  6.  
  7. struct RMQ {
  8.   int lg[maxn], st[20][maxn];
  9.   int get_max(int x, int y) {
  10.     return sum[x] < sum[y] ? y : x;
  11.   }
  12.   void build() {
  13.     st[0][1] = 1;
  14.     for (int i = 2; i <= n; i++) {
  15.       st[0][i] = i;
  16.       lg[i] = lg[i >> 1] + 1;
  17.     }
  18.     for (int i = 1; i < 20; i++) {
  19.       for (int j = 1; j + (1 << i) - 1 <= n; j++) {
  20.         st[i][j] = get_max(st[i - 1][j], st[i - 1][j + (1 << (i - 1))]);
  21.       }
  22.     }
  23.   }
  24.   int query(int l, int r) {
  25.     int k = lg[r - l + 1];
  26.     return get_max(st[k][l], st[k][r - (1 << k) + 1]);
  27.   }
  28. } ST;
  29.  
  30. struct node {
  31.   int st, l, r, pos;
  32.   node(int _s = 0, int _l = 0, int _r = 0) :
  33.     st(_s), l(_l), r(_r), pos(ST.query(_l, _r)) {}
  34.   int get_val() const {
  35.     return sum[pos] - sum[st - 1];
  36.   }
  37.   bool operator < (const node& o) const {
  38.     return get_val() < o.get_val();
  39.   }
  40. };
  41.  
  42. priority_queue <node> Q;
  43.  
  44. int main() {
  45.   scanf("%d %d %d %d", &n, &k, &L, &R);
  46.   for (int i = 1; i <= n; i++) {
  47.     scanf("%d", sum + i), sum[i] += sum[i - 1];
  48.   }
  49.   ST.build();
  50.   for (int i = 1; i <= n - L + 1; i++) {
  51.     Q.push(node(i, i + L - 1, min(n, i + R - 1)));
  52.   }
  53.   long long ans = 0;
  54.   while (k--) {
  55.     node p = Q.top();
  56.     ans += p.get_val(), Q.pop();
  57.     if (p.l < p.pos) Q.push(node(p.st, p.l, p.pos - 1));
  58.     if (p.pos < p.r) Q.push(node(p.st, p.pos + 1, p.r));
  59.   }
  60.   printf("%lld", ans);
  61.   return 0;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement