rioi 1c solution
Ex 题解
1C
考虑暴力 DP:
设
考虑所有转移。对于 A:
- 所有数都可以往后接一个更小的数转移到 0。
- 1 可以接任意数转移到对应的数。
- 0 接任意数转移到 1。
- 其余转移不多。
对于 C:
- 所有数都可以往后接一个更小的数转移到
0 。 - 所有数都可以往后接自己转移到
1 。 - 所有数都可以往后接自己 +1 转移到自己 +1。
- 1 可以接任意数转移到该数。
- 其余转移不多。
这里会有几个重复转移(例如
依次考虑每一种转移:
- 全局
\sum a_i(i-1) ,单点修改 - 全局加
- 单点修改,单点求值
- 单点修改,单点求值
- 同 1
- 全局和,单点修改
- 整体向右平移一位
- 全局加
- 同 3
所以数据结构需要支持:
注意这个转移的过程中前一列的 DP 不能继承到后一列,所以还要支持:
使用一个
- 单点修改:这里是单点加,下放标记(如果
t_i<t_0 ,将时间修改到t_0 ,f_i 修改到v_0 )之后直接改数组并对应更新s_1 和s_2 就行,O(1) 。 - 单点求值:下放标记后返回
f_i+v_A 即可,O(1) 。 - 全局加:修改
v_A,s_1,s_2 即可,O(1) 。 - 全局和:返回
s_1 即可,O(1) 。 - 全局
\sum a_i(i-1) :返回s_2+f_0 即可(注意s_2 中f_0 的系数是-1 ),O(1) 。 - 向右平移一位:修改
f,t 的起始指针的位置(可以开一个两倍长的数组,初始把指针指在中间,这样每次直接自减 1 即可),并对应修改s_1 和s_2 即可,O(1) 。 - 清零:将
t_0 设为当前时间,v_0 设为-v_A ,s_1 和s_2 均设为0 即可,O(1) 。
最后一个运算符特殊处理,需要求组合数上指标前缀和或者下降幂底数前缀和,都是经典问题,可以
所以这题就做完了。最后复杂度是