3 条题解

  • 1
    @ 2023-10-26 20:48:38
    #include <bits/stdc++.h>
    //#define int long long
    using namespace std;
    const int N = 100005 , SN = 1005;
    
    int n , m , a[ N ];
    int b[ N ]; 
    int lenb;
    int q[ N ] , st[ SN ] , ed[ SN ];
    int sum[ SN ] , add[ SN ];
    
    void sortt( int id )
    {
    	for( int i = st[ id ] ; i <= ed[ id ] ; i ++ )
    		b[ i ] = a[ i ];
    	sort( b + st[ id ] , b + ed[ id ] + 1 );
    }
    
    void modify( int l , int r , int v )
    {
    	int lx = q[ l ] , rx = q[ r ];
    	
    	if( lx == rx )
    	{
    		for( int i = l ; i <= r ; i ++ )
    			a[ i ] += v;
    		sortt( lx );
    		return;
    	}
    	
    	for( int i = l ; i <= ed[ lx ] ; i ++ )
    		a[ i ] += v;
    	sortt( lx );
    	
    	for( int i = lx + 1 ; i <= rx - 1 ; i ++ )
    		add[ i ] += v;
    	
    	for( int i = st[ rx ] ; i <= r ; i ++ ) 
    		a[ i ] += v;
    	sortt( rx );
    }
    
    int getnum( int id , int x )
    {
    	int l = st[ id ] , r = ed[ id ] , mid , ans = l - 1;
    	while( l <= r )
    	{
    		mid = ( l + r >> 1 );
    		if( b[ mid ] > x )
    			r = mid - 1;
    		else
    			ans = mid , l = mid + 1;
    	}
    	
    	return ans - st[ id ] + 1;
    }
    
    int query( int l , int r , int x )
    {
    	int lx = q[ l ] , rx = q[ r ] , ans = 0;
    	
    	if( lx == rx )
    	{
    		for( int i = l ; i <= r ; i ++ )
    			ans += ( a[ i ] <= x - add[ lx ] );
    		return ans;
    	}
    	
    	for( int i = l ; i <= ed[ lx ] ; i ++ )
    		ans += ( a[ i ] <= x - add[ lx ] );
    	
    	for( int i = lx + 1 ; i <= rx - 1 ; i ++ )
    		ans += getnum( i , x - add[ i ] ); 
    	
    	for( int i = st[ rx ] ; i <= r ; i ++ )
    		ans += ( a[ i ] <= x - add[ rx ] );
    	
    	return ans;
    }
    
    void init()
    {
    	lenb = sqrt( n );
    	for( int i = 1 ; i <= ( n - 1 ) / lenb + 1 ; i ++ )
    	{
    		st[ i ] = ( i - 1 ) * lenb + 1;
    		ed[ i ] = min( i * lenb , n );
    		for( int j = st[ i ] ; j <= ed[ i ] ; j ++ )
    			q[ j ] = i , sum[ i ] += a[ j ];
    		sortt( i ); 
    	}
    }
    
    signed main()
    {
    	cin >> n;
    	for( int i = 1 ; i <= n ; i ++ )
    		scanf( "%d" , a + i );
    	init();
    	
    	cin >> m;
    	while( m -- )
    	{
    		int opt , l , r , x;
    		scanf( "%d%d%d%d" , & opt , & l , & r , & x );
    		
    		if( opt == 1 )
    		{
    			modify( l , r , x );
    		}
    		
    		if( opt == 2 )
    		{
    			printf( "%d\n" , query( l , r , x ) );
    		}
    	}
    	
    	return 0;
    }
    
    • 0
      @ 2023-10-26 20:23:47
      #include <bits/stdc++.h>
      using namespace std;
      
      int main() {
      	int n = 10;
      	vector<int> vec(n);
      	for (int i = 0; i < n; i++) vec[i] = rand() % 20 + 1;
      	
      	for (int i = 0; i < n; i++) cout << vec[i] << ", "; cout << endl;
      	
      	sort(vec.begin(), vec.end());
      	
      	for (int i = 0; i < n; i++) cout << vec[i] << ", "; cout << endl;
      	
      	int x;
      	cin >> x;
      	cout << upper_bound(vec.begin(), vec.end(), x) - vec.begin() << endl;
      	
      	return 0;
      }
      
      • -1
        @ 2023-10-26 20:48:24

        #include <bits/stdc++.h> //#define int long long using namespace std; const int N = 100005 , SN = 1005;

        int n , m , a[ N ]; int b[ N ]; int lenb; int q[ N ] , st[ SN ] , ed[ SN ]; int sum[ SN ] , add[ SN ];

        void sortt( int id ) { for( int i = st[ id ] ; i <= ed[ id ] ; i ++ ) b[ i ] = a[ i ]; sort( b + st[ id ] , b + ed[ id ] + 1 ); }

        void modify( int l , int r , int v ) { int lx = q[ l ] , rx = q[ r ];

        if( lx == rx )
        {
        	for( int i = l ; i <= r ; i ++ )
        		a[ i ] += v;
        	sortt( lx );
        	return;
        }
        
        for( int i = l ; i <= ed[ lx ] ; i ++ )
        	a[ i ] += v;
        sortt( lx );
        
        for( int i = lx + 1 ; i <= rx - 1 ; i ++ )
        	add[ i ] += v;
        
        for( int i = st[ rx ] ; i <= r ; i ++ ) 
        	a[ i ] += v;
        sortt( rx );
        

        }

        int getnum( int id , int x ) { int l = st[ id ] , r = ed[ id ] , mid , ans = l - 1; while( l <= r ) { mid = ( l + r >> 1 ); if( b[ mid ] > x ) r = mid - 1; else ans = mid , l = mid + 1; }

        return ans - st[ id ] + 1;
        

        }

        int query( int l , int r , int x ) { int lx = q[ l ] , rx = q[ r ] , ans = 0;

        if( lx == rx )
        {
        	for( int i = l ; i <= r ; i ++ )
        		ans += ( a[ i ] <= x - add[ lx ] );
        	return ans;
        }
        
        for( int i = l ; i <= ed[ lx ] ; i ++ )
        	ans += ( a[ i ] <= x - add[ lx ] );
        
        for( int i = lx + 1 ; i <= rx - 1 ; i ++ )
        	ans += getnum( i , x - add[ i ] ); 
        
        for( int i = st[ rx ] ; i <= r ; i ++ )
        	ans += ( a[ i ] <= x - add[ rx ] );
        
        return ans;
        

        }

        void init() { lenb = sqrt( n ); for( int i = 1 ; i <= ( n - 1 ) / lenb + 1 ; i ++ ) { st[ i ] = ( i - 1 ) * lenb + 1; ed[ i ] = min( i * lenb , n ); for( int j = st[ i ] ; j <= ed[ i ] ; j ++ ) q[ j ] = i , sum[ i ] += a[ j ]; sortt( i ); } }

        signed main() { cin >> n; for( int i = 1 ; i <= n ; i ++ ) scanf( "%d" , a + i ); init();

        cin >> m;
        while( m -- )
        {
        	int opt , l , r , x;
        	scanf( "%d%d%d%d" , & opt , & l , & r , & x );
        	
        	if( opt == 1 )
        	{
        		modify( l , r , x );
        	}
        	
        	if( opt == 2 )
        	{
        		printf( "%d\n" , query( l , r , x ) );
        	}
        }
        
        return 0;
        

        }

        • 1

        信息

        ID
        4
        时间
        1000ms
        内存
        256MiB
        难度
        9
        标签
        递交数
        15
        已通过
        2
        上传者