Guest User

Untitled

a guest
Nov 1st, 2016
272
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.94 KB | None | 0 0
  1.  
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. #define lli long long int
  5.  
  6. struct SegmentTree
  7. {
  8.     vector<int> s;      // tree
  9.     vector<int> u;      // update
  10.     int n; 
  11.    
  12.     SegmentTree( int _n ); 
  13.     int get( int l , int r );
  14.     int get(int p , int l , int r , int x , int y );
  15.     void propagate( int p , int l , int r );
  16.     void update( int l , int r , int d );
  17.     void update( int p , int l , int r , int x , int y , int d );
  18. };
  19.  
  20. lli x[1005] , y[1005];
  21. struct E
  22. {
  23.     lli time , type , val;      // type : 0=add  , 1=delete
  24.     E( lli _ti , lli _ty , lli _v ) { time = _ti , type = _ty , val = _v; }
  25.     E() {}
  26.     bool operator < ( const E& x )  const
  27.     {
  28.         if ( time != x.time ) return time < x.time;
  29.         if ( type != x.type ) return type < x.type;
  30.         return val < x.val;
  31.     }
  32. } e[3005];
  33.  
  34.  
  35. int main()
  36. {
  37.     int T; cin>>T;
  38.     while (  T-- )
  39.     {
  40.         int n;
  41.         lli m;
  42.         cin>>n>>m;
  43.         for ( int i=0 ; i<n ; i++ )
  44.             cin>>y[i]>>x[i];
  45.        
  46.         int ans = 0;
  47.            
  48.         {
  49.             lli S = m; //min( 1000 , m );
  50.             for ( lli w=1 ; w<=S ; w++ )        // set fixed width and height and walk on columns
  51.             {
  52.                 lli h = m / w;
  53.                
  54.                 for ( int i=0 ; i<n ; i++ )
  55.                 {
  56.                     e[2*i] = E( x[i] , 0 , y[i] );          // time to add
  57.                     e[2*i + 1] = E( x[i]+w , 1 , y[i] );    // time to delete
  58.                 }
  59.                 sort( e , e+2*n );
  60.                
  61.                 SegmentTree st( 1005 );
  62.                 for ( int i=0 ; i<2*n ; i++ )
  63.                 {
  64.                     lli taim = e[i].time , type = e[i].type , val = e[i].val;
  65.                    
  66.                     if ( type == 0 )        // add
  67.                     {
  68.                         st.update( max(1LL , val-h) , val , +1 );
  69.                         ans = max( ans , st.get( 1 , 1000 ) );
  70.                     }
  71.                     else if ( type == 1 )   // delete
  72.                     {
  73.                         st.update( max(1LL , val-h) , val , -1 );
  74.                     }
  75.                 }
  76.             }
  77.         }
  78.                
  79.         cout<<ans<<"\n";
  80.     }
  81.    
  82.     return 0;
  83. }
  84.  
  85.  
  86. // struct SegmentTree
  87. // {
  88.     SegmentTree::SegmentTree( int _n )
  89.     {
  90.         n = _n;
  91.         s.resize(6*n+5 , 0);
  92.         u.resize(6*n+5 , 0);
  93.     }
  94.    
  95.     int SegmentTree::get( int l , int r )
  96.     {
  97.         return get( 1 , 1 , n , l , r );
  98.     }
  99.    
  100.     int SegmentTree::get(int p , int l , int r , int x , int y )
  101.     {
  102.         if ( r < x || l > y ) return 0;
  103.         propagate(p , l , r);
  104.         if ( l>=x && r<=y ) return s[p];
  105.        
  106.         int L = p*2 , R = p*2+1 , m = (l+r)/2;
  107.         int ansL = get( L , l , m , x , y );
  108.         int ansR = get( R , m+1 , r , x , y );
  109.         return max(ansL , ansR);
  110.     }
  111.    
  112.     void SegmentTree::propagate( int p , int l , int r )
  113.     {
  114.         int L = p*2 , R = L+1 , S = r-l+1;
  115.         s[p] += u[p];
  116.         if (L < s.size()) u[L] += u[p];
  117.         if (R < s.size()) u[R] += u[p];
  118.         u[p] = 0;
  119.     }
  120.    
  121.     void SegmentTree::update( int l , int r , int d )
  122.     {
  123.         update( 1 , 1 , n , l , r , d );
  124.     }
  125.    
  126.     void SegmentTree::update( int p , int l , int r , int x , int y , int d )
  127.     {
  128.         if ( r < x || l > y ) { propagate(p , l , r); return; }
  129.         if ( l>=x && r<=y )
  130.         {
  131.             u[p] += d;
  132.             propagate(p , l , r);
  133.             return;
  134.         }
  135.        
  136.         propagate(p , l , r);
  137.         int L = p*2 , R = p*2+1 , m = (l+r)/2;
  138.         update( L , l , m , x , y , d );
  139.         update( R , m+1 , r , x , y , d );
  140.         s[p] = max( s[L] , s[R] );
  141.     }
  142. // }
Add Comment
Please, Sign In to add comment