1 条题解

  • 0
    @ 2025-2-24 12:43:50
    #include<bits/stdc++.h>
    using namespace std;
    long long n;
    
    // 原始数据
    long long a[300015];
    // t[i]表示最新的i出现的位置
    long long t[300015];
    
    // tt[i] 表示有多少个i
    long long tt[300015];
    
    // presum[i] 形如ix这样的组合有多少个
    long long presum[300015];
    
    signed main(){
        cin>>n;
        long long ans=0;
        for(long long i=1;i<=n;i++){
            cin>>a[i];
    
            // 更新 a[i],x 的组合数量
            // 看前面有多少个a[i]
            // 然后计算两个a[i] 之间的数量
            // 新增的a[i],x 的组合数量为 (i - t[a[i]] - 1) * tt[a[i]]
    
            presum[a[i]] += (i - t[a[i]] - 1) * tt[a[i]];
    
            // 前面有多少个 a[i],x组合数量,当出现新的a[i]时就增加了相应的a[i],x,a[i]这样的夹心饼干
            ans+=presum[a[i]];
    
            // 更新a[i]的位置
            t[a[i]]=i;
    
            // 更新a[i]的数量
            tt[a[i]]++;
        }
        cout<<ans;
        return 0;
    }
    
    • 1

    信息

    ID
    2046
    时间
    1000ms
    内存
    128MiB
    难度
    8
    标签
    递交数
    23
    已通过
    6
    上传者