2019.11.6日总结
今天由于部分原因,早上只有部分时间在刷题,下午3:00-6:00在刷题
1256F - Equalizing Two Strings
感悟:
- 精妙之处,就是通过交换两个相邻的字符来使得另一个字符串变为该字符串。
1256E - Yet Another Division Into Teams
错误:
- 首先读错题意了,以为是每组的最大值最小为多少
感悟:
- 可以考虑到一个团队的人数只能是3,4,5。所以,首先我们从小到大排序,然后我们用 d p [ i ] dp[i] dp[i] 代表以 最后一个团队以 i i i 结尾的的最小价值,这时候我们只需枚举最后一个团队的人即可。
1250J - The Parade
很简单就能想到二分枚举每行的人数(单调性),因为一个团队的跨度不会超过2,所以我们很容易check。
1250B - The Feast and the Bus
错误
-
因为不细心,结果超int了,计算但是算错了,导致没有开long long
-
极致情况只有一个数的时候导致出错,没有考虑到,样例中有这么一组样例,但是没有测样例
感悟:
- 没有想到枚举每个的容量,如果我们枚举容量的话,可以在O(k)时间内check,但是枚举容量的范围可以优化到很低,首先从小到大排序,为了让所有人都坐上车,那么下界为
m
a
x
(
a
i
)
max(a_i)
max(ai),容量最大的时候,即使用的车次最小为两次,对于这种情况我们只需两边对称的坐一个车,然后取最大值就是上界。
- 我们求某个容量的最小车次,贪心从大到小遍历,如果能带一个小的就带一个小的即可。
1249D2 - Too Many Segments (hard version)
感悟:
- 因为数据范围较小,所以我们可以差分求出被覆盖次数大于k的点。但是当时没想到这一点,差点要离线+树状数组处理。
- 对于覆盖次数大于k的点,如果我们先考虑最左边的这样的点就好办了,对于最左边这样的点,我们要删除一条线段,那么必定删除覆盖到这个点的最靠右的线段。所以我们只需考虑从左到右考虑覆盖次数>k,维护一个待选线段集合,然后将覆盖到这个点的线段都加入集合中,每次取出最靠右的线段删除即可,
Gym - 102056I
感悟
- 这道DP的题实在是太妙了。由于增加攻击力,只会被后面攻击的次数影响。增加投资,会被后面攻击的位置的和影响,所以我们可以倒着回来dp, d p [ i ] [ k ] [ s u m ] dp[i][k][sum] dp[i][k][sum]状态为倒着回来考虑第 i i i 个点,并且从该点开始,后面攻击共k次,攻击的位置的和为sum。
- 如果第 i i i 次是攻击,则 d p [ i ] [ k ] [ s u m ] = d p [ i − 1 ] [ k − 1 ] [ s u m − i ] + a i dp[i][k][sum]=dp[i-1][k-1][sum-i]+a_i dp[i][k][sum]=dp[i−1][k−1][sum−i]+ai
- 如果第 i i i 次是投资攻击力,对于后面攻击位置 j j j,那么对该攻击的贡献是 c i c_i ci,则 d p [ i ] [ k ] [ s u m ] = d p [ i − 1 ] [ k ] [ s u m ] + c i ∗ k dp[i][k][sum]=dp[i-1][k][sum]+c_i*k dp[i][k][sum]=dp[i−1][k][sum]+ci∗k
- 如果第 i i i 次是投资,对于后面攻击位置 j j j,那么对该攻击的贡献是 ( j − i ) ∗ b i (j-i)*b_i (j−i)∗bi,则 d p [ i ] [ k ] [ s u m ] = d p [ i − 1 ] [ k ] [ s u m ] + ( s u m − k ∗ i ) ∗ b i dp[i][k][sum]=dp[i-1][k][sum]+(sum-k*i)*b_i dp[i][k][sum]=dp[i−1][k][sum]+(sum−k∗i)∗bi
- 需要注意的细节是状态合法性需要check或无效处理