1 条题解

  • 0
    @ 2023-6-21 20:01:37

    C++ :

    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    #include <vector>
    #define lowbit( i ) i & -i
    #define MAXN 200010
    
    using namespace std;
    
    int n , m , p1 , p2 , st[ MAXN ] , L[ MAXN ] , R[ MAXN ] , a[ MAXN ];
    long long ans[ MAXN ];
    
    inline int read()
    {
    	register int x = 0 , ch = getchar();
    	while( !isdigit( ch ) ) ch = getchar();
    	while( isdigit( ch ) ) x = x * 10 + ch - '0' , ch = getchar();
    	return x;
    }
    
    struct BIT
    {
    	long long t[2][ MAXN ];
    	inline void modify( int x , int y )
    	{
    		for( register int i = x ; i <= n ; i += lowbit( i ) )
    			t[0][i] += y , t[1][i]++;
    	}
    	inline long long find( int f , int x )
    	{
    		register long long ans = 0;
    		for( register int i = x ; i ; i -= lowbit( i ) )
    			ans += t[f][i];
    		return ans;
    	}
    } bit[4];
    
    struct ask
    {
    	int a , b , c , d , e , f;
    	ask() {}
    	ask( int a , int b , int c , int d , int e , int f ) : a( a ) , b( b ) , c( c ) , d( d ) , e( e ) , f( f ) {}
    };
    
    vector < ask > linker[ MAXN ];
    
    inline void add( int a , int b , int c , int d , int e , int f , int g )
    {
    	linker[a].push_back( ask( b , c , d , e , f , g ) );
    }
    
    #define cur linker[i][j]
    
    int main()
    {
    	n = read() , m = read() , p1 = read() , p2 = read();
    	for( register int i = 2 ; i <= n + 1 ; i++ ) a[i] = read();
    	a[1] = n + 1 , a[n + 2] = n + 2;
    	++++n;
    	for( register int i = 1 , top = 0 ; i <= n ; i++ )
    	{
    		while( top && a[ st[ top ] ] < a[i] ) top--;
    		L[i] = st[ top ];
    		st[ ++top ] = i;
    	}
    	for( register int i = n , top = 0 ; i ; i-- )
    	{
    		while( top && a[ st[ top ] ] < a[i] ) top--;
    		R[i] = st[ top ];
    		st[ ++top ] = i;
    	}
    	for( register int i = 1 ; i <= m ; i++ )
    	{
    		int l = read() + 1 , r = read() + 1;
    		add( r , p1 - p2 , 1 , 1 , n - l + 1 , i , 1 );
    		add( r , p1 - p2 , 2 , 1 , r , i , 1 );
    		add( r , p2 , 2 , 0 , r + 1 , i , 0 );
    		add( r , -p2 , 1 , 0 , n - l + 2 , i , 0 );
    		add( r , p2 , 3 , 1 , n - r - 1 , i , r + 1 );
    		add( r , -p2 , 0 , 1 , l - 2 , i , l - 1 );
    		add( l - 1 , p2 - p1 , 1 , 1 , n - l + 1 , i , 1 );
    		add( l - 1 , p2 - p1 , 2 , 1 , r , i , 1 );
    		add( l - 1 , -p2 , 2 , 0 , r + 1 , i , 0 );
    		add( l - 1 , p2 , 1 , 0 , n - l + 2 , i , 0 );
    		add( l - 1 , -p2 , 3 , 1 , n - r - 1 , i , r + 1 );
    		add( l - 1 , p2 , 0 , 1 , l - 2 , i , l - 1 );
    		ans[i] -= p2 * 2 * ( r - l + 1 );
    	}
    	for( int i = 2 ; i <= n - 1 ; i++ )
    	{
    		bit[0].modify( L[i] , L[i] );
    		bit[1].modify( n - L[i] + 1 , L[i] );
    		bit[2].modify( R[i] , R[i] );
    		bit[3].modify( n - R[i] + 1 , R[i] );
    		for( int j = 0 ; j < linker[i].size() ; j++ )
    			ans[ cur.e ] += cur.a * bit[ cur.b ].find( cur.c , cur.d ) * ( cur.c ? cur.f : 1 );
    	}
    	for( register int i = 1 ; i <= m ; i++ ) printf( "%lld\n" , ans[i] );
    	return 0;
    }
    
    • 1

    信息

    ID
    1019
    时间
    2000ms
    内存
    512MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者