0w1

LHPC 2016 pF. 毛毛蟲 ( Ad hoc )

f:id:h0rnet:20160820214434p:plain
f:id:h0rnet:20160820214528p:plain
本來以為很困難,最後幾分鐘突然靈感來。
假設由左到右有若干連續的人往右看,接著若干連續一排人往左看,那麼,哭哭的次數是固定的。假設左邊的人數為 L, 右邊的人數為 R, 考慮其中任何一個人,不失一般性取向右看的其中一人,不管他待到右邊的所有人都不見,還是一開始就被右邊的所有人看見,甚至是看了右邊 k 個人不見後,自己不見使剩下的 R - k 的人哭哭,是的,無論如何他的貢獻都是 R,不會變的。擴展到一般情況大家都亂排,這個道理也是不會變的。因此結論很簡單,答案就是兩人互看的組合數。

void solve(){
    int N; cin >> N;
    string s; cin >> s;
    vi A( N );
    for( int i = 0; i < N; ++i )
        A[ i ] = s[ i ] == 'R';
    vi pA( N + 1 );
    for( int i = 0; i < N; ++i )
        pA[ i + 1 ] = pA[ i ] + A[ i ];
    ll ans = 0;
    for( int i = 0; i < N; ++i ){
        if( A[ i ] == 0 )
            ans += pA[ i ];
        else
            ans += ( N - i - 1 - ( pA[ N ] - pA[ i + 1 ] ) );
    }
    cout << ans / 2 << endl;
}