求助,全WA
查看原帖
求助,全WA
476514
金帆海007楼主2024/10/4 13:33
#include<bits/stdc++.h>
#define int long long
using namespace std ;
const int N = 2e5 + 5 ;
int a[N] , b[N] ;
int cnt[N] ;
int si ;
int n , m ;
struct node{
	int l , r ;
	int id ;
} q[N] ;
int L[N] , R[N] ;//Every block's left side and right side
int blo[N] ;//block
long long ans[N] ;
int l = 0 , r = 0 , tmp = 0 , ti = 0 ;
bool cmp( node x , node y ) {
	return ( blo[ x.l ] == blo[ y.l ] ) ? ( x.r < y.r ) : ( blo[ x.l ] == blo[ y.l ] ) ;
}
int js( int lt , int rt ) {
	long long to[N] ;
	long long anst = 0 ;
	for ( int i = lt ; i <= rt ; i++ ) {
		++to[ a[i] ] ;
	}	
	for ( int i = lt ; i <= rt ; i++ ) {
		anst = max( anst , to[ a[i] ] * b[ a[i] ] ) ;
	}
	for ( int i = lt ; i <= rt ; i++ ) {
		--to[ a[i] ] ;
	}
	return anst ;
}
void add( int x ) {
	cnt[ a[x] ]++ ;
	tmp = max( tmp , cnt[ a[x] ] * b[ a[x] ] ) ;
}
signed main( ) {
	ios::sync_with_stdio( false ) ;
	cin.tie( 0 ) , cout.tie( 0 ) ;
	cin >> n >> m ;
	si = sqrt( n ) ;
	for ( int i = 1 ; i <= n ; i++ ) {
		cin >> a[i] ;
		b[i] = a[i] ;
	}
	for ( int i = 1 ; i <= m ; i++ ) {
		cin >> q[i].l >> q[i].r ;
		q[i].id = i ;
	}
	sort( b + 1 , b + n + 1 ) ;
	int u = unique( b + 1 , b + n + 1 ) - b - 1 ;
	for ( int i = 1 ; i <= n ; i++ ) {
		a[i] = lower_bound( b + 1 , b + u + 1 , a[i] ) - b ;
	}
	int bl = n / si ;
	for ( int i = 1 ; i <= bl ; i++ ) {
		L[i] = R[ i - 1 ] + 1 ;
		R[i] = L[i] + si - 1 ;
	}
	if ( R[bl] < n ) {
		bl++ ;
		L[bl] = R[ bl - 1 ] + 1 ;
		R[bl] = n ;
	}
	for ( int i = 1 ; i <= n ; i++ ) {
		blo[i] = ( i - 1 ) / si + 1 ;
	}
	sort( q + 1 , q + m + 1 , cmp ) ;
	for ( int i = 1 , l = 0 , r = 0 , ti = 1 ; i <= bl ; i++ ) {
		tmp = 0 ;
		memset( cnt , 0 , sizeof( cnt ) ) ;
		r = R[i] ;
		while ( blo[ q[ti].l ] == i ) {
			l = R[i] + 1 ;
			if ( q[ti].r - q[ti].l <= si ) {
				ans[ q[ti].id ] = js( q[ti].l , q[ti].r ) ;
				ti++ ;
				continue ;
			} 
			while ( q[ti].r > r ) {
				add( ++r ) ;
			}
			long long now = tmp ;
			while ( l > q[ti].l ) {
				add( --l ) ;
			}
			ans[ q[ti].id ] = tmp ;
			tmp = now ;
			while ( l <= R[i] ) {//roll back
				--cnt[ a[ l++ ] ] ;
			}
			ti++ ;
		}
	}
	for ( int i = 1 ; i <= m ; i++ ) {
		cout << ans[i] << endl ;
	}
	return 0 ;
}

2024/10/4 13:33
加载中...