AC:3
ALL:6
补题:2
AB略。
C. Make it Increasing
-
题意:给定一个包含 n 个正整数的数列 a 以及一个长度为 n 的数列 b ,初始时数列 b 的每一个元素都为0。定义一次操作为把数列 bb 中的某个元素 b i b_i bi 加上或减去 a i a_i ai 的值,求使得数列 bb 严格递增最小的操作次数。
-
思路:发现一定有某一位是 0 ,枚举 0 的位置计算即可。这里用到了 之前 总结的一个式子。
-
AC代码:https://codeforces.com/contest/1668/submission/157391074
D. Optimal Partition
-
题意:给定一个有 n 个数的数列 a,现在把它分成若干段。每一段的贡献是:总和为正数,贡献是区间长度;总和为0,贡献为0;总和为负数,贡献是区间长度的相反数。问所有分割方案中的最大贡献。
-
思路:
可以想到一个 O ( n 2 ) O(n^2) O(n2) 的 dp: f ( i ) = max j ∈ [ 1 , i − 1 ] { f ( j ) + v a l ( j , i ) } f(i)=\max_{j \in [1,i-1]}\{f(j)+val(j,i)\} f(i)=maxj∈[1,i−1]{f(j)+val(j,i)} 。但是时间复杂度不可以。
正解是数据结构优化 dp 。对于所有的 j , v a l ( j , i ) val(j,i) val(j,i) 可以分为 3 类:
- v a l ( j , i ) < 0 val(j,i) < 0 val(j,i)<0 ,对于这种和为负数的区间,拆分为单个数肯定不会更差。
- v a l ( j , i ) = 0 val(j,i) = 0 val(j,i)=0 ,我们查询所有 s u m j = s u m i sum_j=sum_i sumj=sumi 的最大值 f j f_j fj ,用 map 维护即可。
- v a l ( j , i ) > 0 val(j,i) > 0 val(j,i)>0 ,我们要查询所有 s u m j < s u m i sum_j<sum_i sumj<sumi 的最大值 f j − j f_j-j fj−j , 用树状数组维护 f j − j f_j-j fj−j 即可。
E. Half Queen Cover
-
题意:
-
思路:太难想了不写那么多了。构造两个交替的反对角线。
-
AC代码:https://codeforces.com/contest/1668/submission/157441912