1 条题解

  • 0
    @ 2026-9-30 12:59:53

    C++ :

    
    /* std:候选值(出现次数 >= 自身代号的值,数量 O(sqrt n))+ 二分统计区间出现次数 */
    #include <cstdio>
    #include <algorithm>
    #include <vector>
    using namespace std;
    int n, m, K = 0, ncan = 0;
    int raw[100005], a[100005];
    int srt[100005], cand[100005];
    vector<int> occ[100005];
    long long val[100005];
    int main(){
        if(scanf("%d", &n) != 1) return 0;
        for(int i = 1; i <= n; i++){ scanf("%d", &raw[i]); srt[i] = raw[i]; }
        sort(srt + 1, srt + n + 1);
        K = (int)(unique(srt + 1, srt + n + 1) - (srt + 1));
        for(int i = 1; i <= n; i++){
            int id = (int)(lower_bound(srt + 1, srt + K + 1, raw[i]) - srt);
            a[i] = id;
            val[id] = raw[i];
            occ[id].push_back(i);
        }
        for(int id = 1; id <= K; id++)
            if((long long)occ[id].size() >= val[id]) cand[ncan++] = id;
        scanf("%d", &m);
        while(m--){
            int L, R, k;
            scanf("%d %d %d", &L, &R, &k);
            int good = 0;
            for(int t = 0; t < ncan; t++){
                vector<int>& v = occ[cand[t]];
                int c = (int)(upper_bound(v.begin(), v.end(), R) - lower_bound(v.begin(), v.end(), L));
                if((long long)c >= val[cand[t]]) good++;
            }
            long long ans = 1;
            for(int j = 0; j < k; j++) ans = ans * (good - j) / (j + 1);
            printf("%lld\n", ans);
        }
        return 0;
    }
    
    
    • 1

    信息

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