結果
| 問題 | 
                            No.121 傾向と対策:門松列(その2)
                             | 
                    
| コンテスト | |
| ユーザー | 
                             mkawa2
                         | 
                    
| 提出日時 | 2023-04-12 22:56:36 | 
| 言語 | C++17  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 2,459 ms / 5,000 ms | 
| コード長 | 1,906 bytes | 
| コンパイル時間 | 1,024 ms | 
| コンパイル使用メモリ | 91,788 KB | 
| 実行使用メモリ | 128,096 KB | 
| 最終ジャッジ日時 | 2025-03-27 18:08:44 | 
| 合計ジャッジ時間 | 9,911 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge4 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 9 | 
ソースコード
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
class BitSum {
public:
    BitSum(long long n) : _n(n+1), _table(_n, 0), _origin(n, 0) {}
    long long operator[](long long item) const {
        return _origin[item];
    }
    void add(long long i, long long x) {
        _origin[i] += x;
        i += 1;
        while (i < _n) {
            _table[i] += x;
            i += i & -i;
        }
    }
    long long sum(long long i) const {
        i += 1;
        long long res = 0;
        while (i > 0) {
            res += _table[i];
            i -= i & -i;
        }
        return res;
    }
private:
    long long _n;
    std::vector<long long> _table;
    std::vector<long long> _origin;
};
int main() {
    long long n;
    std::cin >> n;
    std::vector<long long> aa(n);
    for (long long i = 0; i < n; i++) {
        std::cin >> aa[i];
    }
    std::vector<long long> dec(aa);
    std::sort(dec.begin(), dec.end());
    dec.erase(std::unique(dec.begin(), dec.end()), dec.end());
    std::map<long long, long long> enc;
    for (long long i = 0; i < dec.size(); i++) {
        enc[dec[i]] = i;
    }
    for (long long i = 0; i < n; i++) {
        aa[i] = enc[aa[i]];
    }
    long long ans = 0;
    for (long long k = 0; k < 2; k++) {
        BitSum left(n), right(n), pair(n);
        for (long long i = 0; i < n; i++) {
            right.add(aa[i], 1);
        }
        for (long long i = 1; i < n-1; i++) {
            long long a = aa[i-1];
            long long l = left[a];
            long long r = right[a];
            pair.add(a, r-l-1);
            left.add(a, 1);
            right.add(a, -1);
            a = aa[i];
            ans += left.sum(a-1) * right.sum(a-1) - pair.sum(a-1);
        }
        for (long long i = 0; i < n; i++) {
            aa[i] = n-1 - aa[i];
        }
    }
    std::cout << ans << std::endl;
    return 0;
}
            
            
            
        
            
mkawa2