Advertisement
bluemmb22

LA3548 Fortune at El Dorado

Nov 1st, 2016
722
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.67 KB | None | 0 0
  1.  
  2. /*
  3.     Problem : http://poj.org/problem?id=2899
  4.     Problem : https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=219&page=show_problem&problem=1549
  5.  
  6.     Idea from this code
  7.     https://github.com/renzov/Red_Crown/blob/master/Live%20Archive/3548.cpp
  8. */
  9.  
  10. #include <iostream>
  11. #include <algorithm>
  12. #include <vector>
  13. #include <stdio.h>
  14. using namespace std;
  15. #define lli long long int
  16.  
  17. struct SegmentTree
  18. {
  19.     vector<int> s;      // tree
  20.     vector<int> u;      // update
  21.     int n;
  22.    
  23.     SegmentTree( int _n );
  24.     int get( int l , int r );
  25.     int get(int p , int l , int r , int x , int y );
  26.     void propagate( int p , int l , int r );
  27.     void update( int l , int r , int d );
  28.     void update( int p , int l , int r , int x , int y , int d );
  29. };
  30.  
  31. int x[1005] , y[1005];
  32. struct E
  33. {
  34.     int time , type , val;      // type : 0=add  , 1=delete
  35.     E( int _ti , int _ty , int _v ) { time = _ti , type = _ty , val = _v; }
  36.     E() {}
  37.     bool operator < ( const E& x )  const
  38.     {
  39.         if ( time != x.time ) return time < x.time;
  40.         if ( type != x.type ) return type < x.type;
  41.         return val < x.val;
  42.     }
  43. } e[2005];
  44.  
  45.  
  46. int main()
  47. {
  48.     int T; scanf( "%d" , &T );
  49.     while ( T-- )
  50.     {
  51.         int n , m;
  52.         scanf( "%d %d" , &n , &m );
  53.         int minX = 1005 , maxX = 0;
  54.         int minY = 1005 , maxY = 0;
  55.         for ( int i=0 ; i<n ; i++ )
  56.         {
  57.             scanf( "%d %d" , &y[i] , &x[i] );
  58.             // y[i] = i+1 , x[i] = i+1;
  59.             minY = min( minY , y[i] );
  60.             maxY = max( maxY , y[i] );
  61.             minX = min( minX , x[i] );
  62.             maxX = max( maxX , x[i] );
  63.         }
  64.        
  65.         if ( (n == 0) || (m == 0) )
  66.         {
  67.             printf( "0\n" );
  68.             continue;
  69.         }
  70.        
  71.         int ans = 0;
  72.         {
  73.             int S = min( maxX-minX+1 , m );
  74.             for ( int w=1 ; w<=S ; w++ )        // set fixed width and height and walk on columns
  75.             {
  76.                 if ( (m/w) == (m/(w+1)) ) continue;     // simple and nice optimization !!!
  77.                 int h = m / w;
  78.                
  79.                 for ( int i=0 ; i<n ; i++ )
  80.                 {
  81.                     e[2*i] = E( x[i] , 0 , y[i] );          // time to add
  82.                     e[2*i + 1] = E( x[i]+w , 1 , y[i] );    // time to delete
  83.                 }
  84.                 sort( e , e+2*n );
  85.                
  86.                 int sz = maxY - minY + 1;
  87.                 SegmentTree st( sz + 5 );
  88.                 for ( int i=0 ; i<2*n ; i++ )
  89.                 {
  90.                     int taim = e[i].time , type = e[i].type , val = e[i].val;
  91.                    
  92.                     if ( type == 0 )        // add
  93.                     {
  94.                         st.update( max(1 , val-h-minY+1) , val-minY+1 , +1 );
  95.                         ans = max( ans , st.get( 0 , sz ) );
  96.                     }
  97.                     else if ( type == 1 )   // delete
  98.                     {
  99.                         st.update( max(1 , val-h-minY+1) , val-minY+1 , -1 );
  100.                     }
  101.                 }
  102.             }
  103.         }
  104.                
  105.         printf( "%d\n" , ans );
  106.     }
  107.    
  108.     return 0;
  109. }
  110.  
  111.  
  112. // struct SegmentTree
  113. // {
  114.     SegmentTree::SegmentTree( int _n )
  115.     {
  116.         n = _n;
  117.         s.resize(6*n+5 , 0);
  118.         u.resize(6*n+5 , 0);
  119.     }
  120.    
  121.     int SegmentTree::get( int l , int r )
  122.     {
  123.         return get( 1 , 1 , n , l , r );
  124.     }
  125.    
  126.     int SegmentTree::get(int p , int l , int r , int x , int y )
  127.     {
  128.         if ( r < x || l > y ) return 0;
  129.         propagate(p , l , r);
  130.         if ( l>=x && r<=y ) return s[p];
  131.        
  132.         int L = p*2 , R = p*2+1 , m = (l+r)/2;
  133.         int ansL = get( L , l , m , x , y );
  134.         int ansR = get( R , m+1 , r , x , y );
  135.         return max(ansL , ansR);
  136.     }
  137.    
  138.     void SegmentTree::propagate( int p , int l , int r )
  139.     {
  140.         int L = p*2 , R = L+1 , S = r-l+1;
  141.         s[p] += u[p];
  142.         if (L < s.size()) u[L] += u[p];
  143.         if (R < s.size()) u[R] += u[p];
  144.         u[p] = 0;
  145.     }
  146.    
  147.     void SegmentTree::update( int l , int r , int d )
  148.     {
  149.         update( 1 , 1 , n , l , r , d );
  150.     }
  151.    
  152.     void SegmentTree::update( int p , int l , int r , int x , int y , int d )
  153.     {
  154.         if ( r < x || l > y ) { propagate(p , l , r); return; }
  155.         if ( l>=x && r<=y )
  156.         {
  157.             u[p] += d;
  158.             propagate(p , l , r);
  159.             return;
  160.         }
  161.        
  162.         propagate(p , l , r);
  163.         int L = p*2 , R = p*2+1 , m = (l+r)/2;
  164.         update( L , l , m , x , y , d );
  165.         update( R , m+1 , r , x , y , d );
  166.         s[p] = max( s[L] , s[R] );
  167.     }
  168. // }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement