Advertisement
LinKin

Convex Trick

Jul 21st, 2013
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.59 KB | None | 0 0
  1. #define pb push_back
  2. typedef long long Long;
  3. vector<Long> VC,VM;
  4. Long Pt;
  5. bool IsBad( Long i,Long j,Long k ){
  6.     return (double)( VC[i]-VC[j] )/( VM[j]-VM[i] )  >= (double)( VC[i]-VC[k] )/( VM[k]-VM[i] );
  7. }
  8. void Add( Long c,Long m ){
  9.     VC.pb( c );
  10.     VM.pb( m );
  11.     while( VC.size()>=3 && IsBad( VC.size()-3,VC.size()-2,VC.size()-1 ) ){
  12.         VC.erase( VC.end()-2 );
  13.         VM.erase( VM.end()-2 );
  14.     }
  15. }
  16. Long Query( Long x ){
  17.     Pt = min( Pt,(Long)VC.size()-1 );
  18.     while( Pt<VC.size()-1 && VC[Pt]+VM[Pt]*x >= VC[Pt+1]+VM[Pt+1]*x ) Pt++;
  19.     return VC[Pt] + VM[Pt]*x;
  20. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement