Advertisement
K_Y_M_bl_C

Untitled

Sep 17th, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.73 KB | None | 0 0
  1. include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6. typedef vector<int> vi;
  7. typedef pair<int, int> pii;
  8.  
  9. #define ff first
  10. #define ss second
  11. #define y1 y111
  12. #define X first
  13. #define Y second
  14. #define mk make_pair
  15. #define inb push_back
  16. #define all(v) v.begin(), v.end()
  17.  
  18. const int MAXN = (int)1e6 + 9, MAXN1 = (int)2e4 + 7;
  19. const int INFint = (int)1e9 + 7, P = 31;
  20. const ll INFll = (ll)1e18 + 7, MOD = (ll)1e9 + 7;
  21. const double INFfl = 1e18 * 4 + 7;
  22. const double EPS = 1e-7;
  23. const double PI = atan2(0, -1);
  24.  
  25. int solve();
  26.  
  27. int main()
  28. {
  29. #define TASK ""
  30. #ifdef _DEBUG
  31.     freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
  32. #else
  33.     //freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
  34. #endif
  35.     solve();
  36. }
  37.  
  38. const int STRBUF = (int)1e6 + 7;
  39. char buf[STRBUF];
  40. string get_str()
  41. {
  42.     scanf(" %s", buf);
  43.     return string(buf);
  44. }
  45.  
  46. const ll MINF = -1e18;
  47.  
  48. struct SegmentTree
  49. {
  50.     struct Node
  51.     {
  52.         ll val, add;
  53.         Node() { val = 0, add = 0; };
  54.         Node(ll x) { val = x, add = 0; };
  55.     };
  56.     vector<Node> t;
  57.     SegmentTree() {};
  58.     SegmentTree(vector<ll> &a)
  59.     {
  60.         t.resize(4 * (int)a.size());
  61.         build(0, 0, (int)a.size() - 1, a);
  62.     }
  63.     Node max(Node a, Node b)
  64.     {
  65.         if (a.val > b.val)
  66.             return a;
  67.         return b;
  68.     }
  69.     void build(int v, int tl, int tr, vector<ll>& a)
  70.     {
  71.         if (tl == tr)
  72.         {
  73.             t[v] = Node(a[tl]);
  74.             return;
  75.         }
  76.         int tm = tl + tr >> 1;
  77.         build(2 * v + 1, tl, tm, a);
  78.         build(2 * v + 2, tm + 1, tr, a);
  79.         t[v] = max(t[2 * v + 1], t[2 * v + 2]);
  80.     }
  81.     void push(int v, int tl, int tr)
  82.     {
  83.         if (!t[v].add)
  84.             return;
  85.         t[v].val += t[v].add;
  86.         if (tl != tr)
  87.         {
  88.             t[2 * v + 1].add += t[v].add;
  89.             t[2 * v + 2].add += t[v].add;
  90.         }
  91.         t[v].add = 0;
  92.     }
  93.     void update(int v, int tl, int tr, int l, int r, ll val)
  94.     {
  95.         push(v, tl, tr);
  96.         if (tl > r || tr < l)
  97.             return;
  98.         if (l <= tl && tr <= r)
  99.         {
  100.             t[v].add += val;
  101.             push(v, tl, tr);
  102.             return;
  103.         }
  104.         int tm = tl + tr >> 1;
  105.         update(2 * v + 1, tl, tm, l, r, val);
  106.         update(2 * v + 2, tm + 1, tr, l, r, val);
  107.         t[v] = max(t[2 * v + 1], t[2 * v + 2]);
  108.     }
  109.     ll get(int v, int tl, int tr, int l, int r)
  110.     {
  111.         push(v, tl, tr);
  112.         if (tl > r || tr < l)
  113.             return MINF;
  114.         if (l <= tl && tr <= r)
  115.         {
  116.             return t[v].val;
  117.         }
  118.         int tm = tl + tr >> 1;
  119.         ll ql = get(2 * v + 1, tl, tm, l, r);
  120.         ll qr = get(2 * v + 2, tm + 1, tr, l, r);
  121.         if (ql < qr)
  122.             swap(ql, qr);
  123.         return ql;
  124.     }
  125. };
  126.  
  127. int solve()
  128. {
  129.     int n, k;
  130.     ll w, v;
  131.     scanf("%d %d %lld %lld", &n, &k, &w, &v);
  132.     vector<ll> d(n);
  133.     for (int i = 0; i < n; ++i)
  134.         scanf("%lld", &d[i]);
  135.     SegmentTree T = SegmentTree(d);
  136.     vi nxt(n, -1);
  137.     for (int i = n - 2; i >= 0; --i)
  138.     {
  139.         T.update(0, 0, n - 1, i + 1, n - 1, -v);
  140.         int l = i, r = min(i + k + 1, n + 1);
  141.         int rbound = r - 1;
  142.         while (r - l > 1)
  143.         {
  144.             int mid = l + r >> 1;
  145.             if (T.get(0, 0, n - 1, mid, rbound) >= w)
  146.                 l = mid;
  147.             else
  148.                 r = mid;
  149.         }
  150.         if (T.get(0, 0, n - 1, l, rbound) >= w)
  151.         {
  152.             nxt[i] = l;
  153.         }
  154.         if (d[i + 1] >= w)
  155.             nxt[i] = max(nxt[i], i + 1);
  156.     }
  157.     int INF = 200000;
  158.     vi dp(n, INF);
  159.     dp[0] = 0;
  160.     for (int i = 0; i < n; ++i)
  161.     {
  162.         if (nxt[i] == -1)
  163.             continue;
  164.         dp[nxt[i]] = min(dp[i] + 1, dp[nxt[i]]);
  165.     }
  166.     printf("%d\n", (dp[n - 1] == INF) ? (-1) : (dp[n - 1]));
  167.     return 0;
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement