1 条题解
-
0
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
- 上传者