1 条题解

  • 1
    @ 2025-4-9 10:42:38
    • 方法1:枚举 i,j,ki,j,k,复杂度 O(n3)O(n^3),会超时。

    • 方法2:着手点 ai105a_i \le 10^5,发现数据范围不大。考虑对每个 aia_i 进行计数,stxst_x 表示 xx 的出现次数,如果枚举 xx,知道 <x<x 的元素数量 leftleft>x>x 的元素数量 rightright,对于 xx 的贡献是可以计算出的 stx×left×rightst_x \times left \times right

    • 为什么可以这样做呢?

    • 其实 i<j<ki<j<k 只是说明三个数不是同一个位置,我们需要在 nn 个数中选择 33 个数,原本就是一个组合问题 Cn3C_n^3 减去不符合题意的部分。所以只要可以维护数据的大小和个数,不必关注数据的位序。

    • 注意数据需要 long longlong\ long.

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 1e6 + 10, INF = 0x3f3f3f3f, MOD = 1E9 + 7;
    
    void solve1() {
        int n, m;
        cin >> n;
        vector<int> a(n + 5);
        for (int i = 1; i <= n; i++)
            cin >> a[i];
    
        ll ans = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = i + 1; j <= n; j++) {
                if (a[i] == a[j]) continue;
                for (int k = j + 1; k <= n; k++) {
                    if (a[j] == a[k] || a[i] == a[k]) continue;
                    ans++;
                }
            }
        }
        cout << ans << endl;
    }
    
    void solve2() {
        int n, m;
        cin >> n;
        vector<int> a(n + 5), st(N, 0);
        for (int i = 1; i <= n; i++)
            cin >> a[i], st[a[i]]++;
    
        ll ans = 0, left = 0, right = n;
        for (int i = 0; i <= 1e5; i++) {
            if (st[i]) {
                right -= st[i];
                ans += left * st[i] * right;
                left += st[i];
            }
        }
        cout << ans << endl;
    }
    int main(int argc, char* argv[]) {
        int t = 1;
        // cin >> t;
        while (t--) {
            solve2();
        }
        return 0;
    }
    
    
    • 1

    信息

    ID
    2084
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    (无)
    递交数
    26
    已通过
    6
    上传者