Advertisement
RaFiN_

Convex Hull Trick Dp optimization

May 2nd, 2020
525
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.36 KB | None | 0 0
  1.  
  2. vector<ll>tangent,con;int type;
  3.  
  4. bool bad(int f1,int f2,int f3){
  5.     if(type==1||type==4){
  6.         return 1.0*(con[f3]-con[f1])*(tangent[f1]-tangent[f2]) <= 1.0*(con[f2]-con[f1])*(tangent[f1]-tangent[f3]);
  7.     }
  8.     else {
  9.         return 1.0*(con[f3]-con[f1])*(tangent[f1]-tangent[f2]) >= 1.0*(con[f2]-con[f1])*(tangent[f1]-tangent[f3]);
  10.     }
  11. }
  12.  
  13. void add(ll a,ll b){
  14.     tangent.pb(a);
  15.     con.pb(b);
  16.     int sz = tangent.size();
  17.     while(sz>=3&&bad(sz-3,sz-2,sz-1)){
  18.         tangent.erase(tangent.end()-2);
  19.         con.erase(con.end()-2);
  20.         sz --;
  21.     }
  22. }
  23.  
  24. ll getval(int indx,ll x){
  25.     return tangent[indx]*x + con[indx];
  26. }
  27.  
  28. ll query1(ll x){
  29.     int low = 0,high = tangent.size() - 1;
  30.     int save;
  31.     ll ans = 1e18;
  32.     while(low<=high){
  33.         ll diff = high - low;
  34.         ll mid1 = low + diff / 3,mid2 = high - (diff) / 3;
  35.         ll x1 = getval(mid1,x) , x2 = getval(mid2,x);
  36.         if(x1<=x2){
  37.             high = mid2-1;
  38.             if(ans>x1){
  39.                 ans = x1;
  40.                 save = mid1;
  41.             }
  42.         }
  43.         else {
  44.             low = mid1+1;
  45.             if(x2<ans){
  46.                 ans = x2;
  47.                 save = mid2;
  48.             }
  49.         }
  50.     }
  51.     return getval(save,x);
  52. }
  53.  
  54. ll query2(ll x){
  55.     int low = 0,high = tangent.size() - 1;
  56.     int save;
  57.     ll ans = -1e18;
  58.     while(low<=high){
  59.         ll diff = high - low;
  60.         ll mid1 = low + diff / 3,mid2 = high - (diff) / 3;
  61.         ll x1 = getval(mid1,x) , x2 = getval(mid2,x);
  62.         if(x1<x2){
  63.             low = mid1+1;
  64.             if(x2>ans){
  65.                 ans = x2;
  66.                 save = mid2;
  67.             }
  68.         }
  69.         else {
  70.             high = mid2-1;
  71.             if(x1>ans){
  72.                 ans = x1;
  73.                 save = mid1;
  74.             }
  75.         }
  76.     }
  77.     return getval(save,x);
  78. }
  79.  
  80. int main()
  81. {
  82.     booster()
  83.    // read("input.txt");
  84.     int q;
  85.     cin >> q >> type;
  86.  
  87.     while(q--){
  88.         int t;
  89.         cin >> t;
  90.         if(t==1){
  91.             ll m,b;
  92.             cin >> m >> b;
  93.             add(m,b);
  94.         }
  95.         else {
  96.             ll x;
  97.             cin >> x;
  98.             if(type==1 || type == 3){
  99.                 cout << query1(x) ;
  100.             }
  101.             else {
  102.                 cout << query2(x);
  103.             }
  104.             cout << endl;
  105.         }
  106.     }
  107.  
  108.     return 0;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement