4eyes4u

Monotonic Queue

Aug 22nd, 2016
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.74 KB | None | 0 0
  1. /*
  2. Monotinic Queue
  3.  
  4. Nalazi min/max za svaki interval duzine len u O(N)
  5. */
  6.  
  7. #include <bits/stdc++.h>
  8. using namespace std;
  9.  
  10. const int N=1e5+10;
  11.  
  12. int a[N], sol[N];
  13. int n, len;
  14.  
  15. void monotonicQueue (const int &len, const int &n)
  16. {
  17.     deque<pair<int, int> > dq;
  18.     for (int i=1;i<=n;i++)
  19.     {
  20.         int x=a[i];
  21.         while (dq.size()>0 && dq.back().first>=x) dq.pop_back();
  22.         while (dq.size()>0 && dq.front().second<i-len+1) dq.pop_front();
  23.         dq.emplace_back(x, i);
  24.         if (i-len+1>0) sol[i-len+1]=dq.front().first;
  25.     }
  26. }
  27.  
  28. int main()
  29. {
  30.     cin >> n >> len;
  31.     for (int i=1;i<=n;i++) cin >> a[i];
  32.  
  33.     monotonicQueue(len, n);
  34.  
  35.     for (int i=1;i<=n-len+1;i++) cout << sol[i] << " ";
  36.  
  37.     return 0;
  38. }
Advertisement
Add Comment
Please, Sign In to add comment