Educational Codeforces Round 91 F(矩阵与线段树优化dp)
2022-07-27 17:35 作者:Asunataisiki | 我要投稿
题意:
对于两个非负整数,现在重新定义加法运算:
将 a,b 一上一下写在两行,并按照低位对齐。
将它们的每一位加起来,并将每一位的结果从高位到低位连接在一起,得到的就是 a⊕b。
(你可以认为,两个数都有无穷多的前导 0)
例如,3248⊕908=311416
你现在有一个仅包含 n 个 0∼9 的数码的字符串 c,并且还有 m 次操作。一次操作为:
x d
- 将 c 的第 x 个数码替换成数码 d 。
(注意,c 在任何时刻都可能存在前导 0)
每次操作过后,你需要输出,有多少个有序对 (a,b),满足 a,b 都是非负整数,且 a⊕b=c。
答案对 998244353 取模。
思路:
动态dp,先考虑没有修改的情况,表示 1 ~
的答案,那么考虑这一位单独称为一个数字的贡献以及与前一个数字组合的贡献(此时前一位必须是1),那么转移方程为
,
因为题目中要求有修改的操作,每次都去跑一边dp一定会超时,所以考虑将这个递推式转换为矩阵,则可以表示为
初始化:把和
置成1
用线段树维护每个区间即可
注意:
线段树在push_up的时候,一定是右儿子乘左儿子(上面矩阵的递推式也可以看出来,(等号左边那一坨)左边是
,右边是
~
)
当修改
时,要修改
和
,因为
在更新dp的时候会用到pos