- T2:
- 拼题怪,前一个部分显然需要找一个简单明显的结论为后一个部分作铺垫。经过不懈的手玩不难发现假设当前玩的人数为 n ( n > 1 ) n(n>1) n(n>1),当 n n n为偶数的时候要么(当前)奇数编号的人全灭,要么偶数编号的人全灭,人数会刚好减少一半。当 n n n为奇数是无论如何刚好以两轮为单位不断循环。
- 由于第一轮比较特殊,所以从第二轮开始将人数不断除以二,如果最后变为1那么其 F F F值就是0,否则为当前值的两倍。
- 这样后一个部分就很好做了,由于是路径问题所以考虑点分治,由于是二进制上的问题所以可以建一颗trie,修改的时候就直接在trie中插入,查询的时候只要往能让当前trie上点对应的值与自己加起来末尾几位全为0即可——注意要从低位往高位遍历。
- 不过要注意因为是统计第二轮的人数,所以要做一点小处理。
- T5:
- 考虑将字典里的串和模板串全部扔进AC自动机里,设一个DP g x g_x gx表示的是 ∑ i = 1 ∣ s x ∣ f ( s x , i , ∣ s x ∣ ) \sum_{i=1}^{|sx|}f(sx,i,|sx|) ∑i=1∣sx∣f(sx,i,∣sx∣),其中 s x sx sx表示的是从AC自动机上的根走到 x x x点得到的字符串,最后答案显然是模板串在AC自动机里对应的点的 g g g值总和。
- 如何求 g g g呢?发现贡献来自两部分——一个是x点fail链指向的那个点(假设为y点)的 g g g值,另一个是 ∑ i = 1 L f ( s x , i , ∣ s x ∣ ) \sum_{i=1}^Lf(sx,i,|sx|) ∑i=1Lf(sx,i,∣sx∣),其中 L L L表示 s x sx sx与 s y sy sy相比多出来的长度。
- 由于 i < = L i<=L i<=L时,所有 y y y点能够包含的子串都可以记入贡献(注意这里不是 f f f值,而是指那些为 s y sy sy后缀的字典串的价值和),所以直接可以将其与 x x x的父亲合并,但要注意 y y y的父亲不一定是 x x x的父亲fail边指向的点,所以要把 x x x的父亲-> y y y的父亲沿途所有点的贡献都加起来。
- T7:
- 考虑要么在环外连边,要么在环内连边,只有两种情况,所以将原图的边看做点,两点之间连边代表它们不能同时出现在环内/环外,最后就是类似于二分图的判断。
- 但暴力连边显然不可行,所以需要排序后用set优化连边。
- T9:
- 先直接设 F ( x ) = ∑ i f i ∗ x i F(x)=\sum_if_i*x^i F(x)=∑ifi∗xi
- 如果不考虑 A A A的特殊贡献,那么 F ( x ) = B ∗ F 2 ( x ) + x F(x)=B*F^2(x)+x F(x)=B∗F2(x)+x。
- 考虑可以先用这个算出 f k f_k fk,因为在这之前都不可能会有 A A A的贡献。
- 随后改一下,变为 F ( x ) = B ∗ F 2 ( x ) + x + ( A − B ) ∗ f k ∗ x k ∗ F ( x ) F(x)=B*F^2(x)+x+(A-B)*f_k*x^k*F(x) F(x)=B∗F2(x)+x+(A−B)∗fk∗xk∗F(x),这是一个一元二次方程,直接多项式开方即可。
02-24
336