Advertisement
cincout

convex hull trick

Apr 12th, 2019
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.78 KB | None | 0 0
  1. struct convex_hull_trick {
  2. ld inter(pair<ll, ll> a, pair<ll, ll> b) {
  3. return 1. * (b.second - a.second) / (a.first - b.first);
  4. }
  5. void add(ll k, ll b) {
  6. while (p.size() > 0 && p.back() * k + b < p.back() * l.back().first + l.back().second) {
  7. p.pop_back();
  8. l.pop_back();
  9. }
  10. if (l.size() == 0) {
  11. l.push_back({k, b});
  12. return;
  13. }
  14. if (l.back().first == k && l.back().second <= b)
  15. return;
  16. p.push_back(inter(l.back(), {k, b}));
  17. l.push_back({k, b});
  18. }
  19. ll get(ll x) {
  20. int id;
  21. if (p.size() == 0) id = 0;
  22. else id = lower_bound(p.begin(), p.end(), x) - p.begin();
  23. return l[id].first * x + l[id].second;
  24. }
  25. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement