0w1

CFR 567 C. Geometric Progression ( Map )

Problem - 567C - Codeforces
題意:
給一個數列和 K,求有多少三個元素構成的有序遞增等比子序列,其比為 K。
解法:
預處理,使可以查詢每個值存在於哪些位置,且這些位置是排序好的。接著枚舉中間的數字,左右邊的數字將會隨之確定,因此將答案增加指定數字在右方的數量*指定數字在左方的數量。數數量的方法就是用 lower_bound 那一類,以枚舉的數字的位置為 value 去搞。

int N, K;
vi A;

void init(){
    cin >> N >> K;
    A = vi( N );
    for( int i = 0; i < N; ++i )
        cin >> A[ i ];
}

map< int, vi > v2p;

void preprocess(){
    for( int i = 0; i < N; ++i )
        v2p[ A[ i ] ].push_back( i );
}

void solve(){
    ll ans = 0;
    for( int i = 1; i + 1 < N; ++i ){
        int lv = A[ i ] / K;
        if( abs( lv ) > ( int ) 1e9 or lv * K != A[ i ] )
            continue;
        ll rv = A[ i ] * K;
        if( abs( rv ) > ( int ) 1e9 or rv / K != A[ i ] )
            continue;
        int lcnt = lower_bound( v2p[ lv ].begin(), v2p[ lv ].end(), i ) - v2p[ lv ].begin();
        int rcnt = v2p[ rv ].end() - upper_bound( v2p[ rv ].begin(), v2p[ rv ].end(), i );
        ans += 1LL * lcnt * rcnt;
    }
    cout << ans << endl;
}