1 条题解

  • 0
    @ 2026-9-30 12:44:46

    C++ :

    
    #include <cstdio>
    /* 得分 = (∏si) / d!,空序列得分为 1。数组非减 ⇒ 长度 d 的最优子序列就是最后 d 个。
       f(0)=1,f(d)/f(d-1) = a[k-d] / d(0-based)随 d 单调不增 ⇒ f 关于 d 单峰。
       答案 = 「使 f(d) 取到最大值的最大 d」 = max{ d<=k : a[k-d] >= d }。
       令 j = k-d,条件化为 a[j] + j >= k;要使 d 最大就取最小的 j。
       k 递增时阈值递增 ⇒ j 单调不减,双指针 O(n)。 */
    static int a[500005];
    int main(){
        int t;
        if(scanf("%d", &t) != 1) return 0;
        while(t--){
            int n;
            scanf("%d", &n);
            for(int i = 0; i < n; i++) scanf("%d", &a[i]);
            int j = 0;
            for(int k = 1; k <= n; k++){
                /* j <= k-1 恒成立:a[k-1] + (k-1) >= 1 + k - 1 = k */
                while(a[j] + j < k) j++;
                printf("%d", k - j);
                if(k == n) putchar('\n'); else putchar(' ');
            }
        }
        return 0;
    }
    
    
    • 1

    信息

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