[关闭]
@mayiyang 2019-08-06T13:08:15.000000Z 字数 638 阅读 425

dp单调队列优化

dp 单调队列

for example: 考虑两个决策,若,则决策永远不可能为。这是因为的值没有,同时比离开决策范围更快。总之,生存能力更强

简单来讲,维护单调递增的一组决策


  1. template <typename T>
  2. struct dequeue
  3. {
  4. vector <T> q;
  5. ll l,r;
  6. void init(int n)
  7. {
  8. q.resize(n);
  9. l=0,r=0;
  10. }
  11. bool empty()
  12. {
  13. return l>=r;
  14. }
  15. T back()
  16. {
  17. return q[r];
  18. }
  19. T front()
  20. {
  21. return q[l];
  22. }
  23. void pop_front()
  24. {
  25. l++;
  26. }
  27. void pop_back()
  28. {
  29. r--;
  30. }
  31. void push_back(T k)
  32. {
  33. q[++r]=k;
  34. }
  35. void insert(T k)
  36. {
  37. while (l<=r&&back().first<=k.first) pop_back();
  38. push_back(k);
  39. }
  40. };

定义:

  1. dequeue<pair<ll,int> > q;
  2. q.init(101001);
  3. for (ll i=1;i<=n;i++)
  4. {
  5. q.insert(make_pair(a[i],i));
  6. while (q.front().second<i-k+1) q.pop_front();
  7. if (i-k+1>0)
  8. {
  9. ans+=q.front().first;
  10. }
  11. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注