0w1

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";
}