2021杭电“MINIEYE杯”(10) 部分题目题解

  • 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=1sxf(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)=ifixi
    • 如果不考虑 A A A​的特殊贡献,那么 F ( x ) = B ∗ F 2 ( x ) + x F(x)=B*F^2(x)+x F(x)=BF2(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)=BF2(x)+x+(AB)fkxkF(x),这是一个一元二次方程,直接多项式开方即可。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值