1 条题解
-
0
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
- 上传者