Atcoder abc338
https://atcoder.jp/contests/abc338
G - evall
给定字符串S,由123456789+*
组成
最开始和最后的字符是数字,没有相邻的非数字
对于$(i\le j)$, 如果s[i],s[j]都是数字,则eval(i,j)为这一段字符串的表达式结果
否则 为0
求 $\displaystyle \sum_{i=1}^{|S|}\sum_{i=j}^{|S|} eval(i,j)\mod 998244353$
$|S| \le 10^6$
2s
1024mb
我的思路
这里虽然没有括号,但是有乘法的优先运算
如果固定前面
1 | 1234123*234*345+3245*145+324*45*345 |
那我们得到的是 [base + prodbase * (cur=34)]
每次遇到数字就是cur*=10,cur+=int(s[i])
而进入新的乘法则是prodbase*=cur, cur = 0
而进入新的加法则是base+=prodbase*cur
,prodbase=1,cur=0
这个方法的问题在于 如果想用矩阵表示,那么在做prodbase * cur
的时候 无法做这个乘法
再增加prodres
东西
1 | 1234123*234*345+3245*145+324*45*345 |
ans = base + prodres
prodres = prodbase * cur
, 而新的转移 发现cur不需要了
那么 遇到数字时,
1 | sumall base prodres prodbase 1 |
那么 遇到+时,
1 | sumall base prodres prodbase 1 |
那么 遇到*
时,
1 | sumall base prodres prodbase 1 |
所以,后缀矩阵乘法就秒了
前置的是[0,0,0,1,1]
Hall theorem
floor sum
$f(a,b,c,n) = \sum_{x=0}^n \lfloor \frac{ax+b}{c} \rfloor$
代码
1 | // \sum_{x=0}^n \lfloor \frac{ax+b}{c} \rfloor |
Atcoder abc337
https://atcoder.jp/contests/abc337
G - Tree Inversion
n点树
for u = 1..n
求 有多少(v,w),满足 w在u..v路径上(w可以等于u,v),且v < w
n 2e5
1024mb
我的思路
如果是一个点u,
那么可以把u作为根,做dfs
dfs过程中 维护父向点集,和求 >= 当前点的个数
这样可以 树状数组维护,是O(n log n) 可以做的
但这同时求多个似乎不太好转换
1 | u |
若和u直接相连的点是v1,v2,…,v3
从换根dp的角度想
如果u换成v1,把这条边叫做edge,那么原来 (u-v2子树),(u-v3子树)… 的贡献都不会变
只有w=u,而v 在(u-v1子树)中的贡献不见了
ans -= tree(edge-v1子树, < u)
多出来的是w=v1,而v在 u-v2/v3/…
ans += tree(edge-u, < v1)
所以如果有预计算 每条边 u0-u1,
tree(u0,< u1) 和tree(u1,< u0),就可以实现换根dp
这怎么算呢,
想的是 启发式合并,每次点少的向多的合并
同样fenwick维护,似乎能做?