HR Maximize Sum ( std::set )
https://www.hackerrank.com/challenges/maximize-sum
所有區間連續和都能表達成兩個前綴和的差,因此可以利用 set尋找適合的另一個前綴。
debug了一個小時,原來第一次插入 set的時候從 0開始了,然後就 WA半天摸不著頭緒。。。
void solve(){ int N; ll M; cin >> N >> M; vector< ll > A( N ); for( int i = 0; i < N; ++i ){ cin >> A[ i ]; A[ i ] %= M; } vector< ll > pa( N + 1 ); for( int i = 0; i < N; ++i ) pa[ i + 1 ] = ( pa[ i ] + A[ i ] ) % M; multiset< ll > pset, qset; for( int i = 1; i <= N; ++i ) qset.insert( pa[ i ] ), pset.insert( -pa[ i ] ); ll ans = *max_element( pa.begin(), pa.end() ); for( int i = 1; i < N; ++i ){ pset.erase( pset.find( -pa[ i ] ) ); qset.erase( qset.find( pa[ i ] ) ); auto it = pset.upper_bound( -pa[ i ] ); if( it != pset.end() ) ans = max( ans, ( ( -*it - pa[ i ] ) % M + M ) % M ); it = qset.upper_bound( pa[ i ] ); if( it != qset.end() ) ans = max( ans, ( ( *it - pa[ i ] ) % M + M ) % M ); } cout << ans << "\n"; }