• 来自多校的一个题——数位DP+卡位


    n<=1e9就要考虑倍增、矩阵乘法这种了

    假设L=0

    考虑枚举二进制下,所有X与R的LCP长度,前len高位

    对于第len+1位,假设R的这一位是1

    如果一个x的这一位是0了,那么后面可以随便填

    我们就钦定一个len+1位是0的x0来挽救,别的随便填,最后距离K差多少,就让这个x0来变成这个数

    而且,为了不重不漏,len必须是这些x的“LCP”,所以必须有两个x第len+1位不同(所以其实R的len位是0的len可以直接跳过没有意义)

    外层枚举LCP,内层我们DP:

    f[i][0/1][0/1]前i个x,第len+1位的xor是多少,有没有一个x第len+1位是0

    转移:

    对于x第len+1位是0:

      f[i+1][t][1]<- f[i][t][1]*(1<<(blabla))+f[i][t][0](如果原来没有len+1位是0的,就让这个来充当最后挽救的,只有一种选择,所以边权是1)

    否则:

      f[i+1][t^1][1]<-f[i][t][1]*(blabla)

      f[i+1][t^1][0]<-.......................同上

    矩阵快速幂即可

    当然还要判断前len位都是卡着R,所以R的前len位n次xor起来必须是K的高位部分

    有L呢?

    首先,对于LCP(L,R)=T,所有的x都是一样的

    之后第T+1位,L=0,R=1,如果x选择0,那么上界就不存在了卡L走,否则下界不存在了卡R走

    当再次和“界”不同的时候,x就“自由”了

    所以,枚举所有x中"第一个自由的x自由的位置len(从高到低)"以此统计答案

    内层DP:

    f[i][0/1][0/1][0/1]

    前i个x,奇数/偶数个上界(为了最后统计能不能到K),自由那一位的xor是0/1,有没有一个x自由了

    转移同理。矩阵乘法

    总结:

    在二进制的运算下,不光比较大小简单,而且不进位,所以高位枚举LCP就是很好的方法。

    而数据有上下界,卡位使得可以“自由”,“自由”后就随便填了

    最后留下一个x挽救,使得能够存在一种可以xor出K的方案!

    还有一个简单点的:
    WinterAndSnowmen

  • 相关阅读:
    问题:charles开启Charles-Proxy-macOS Proxy 时报错
    通关中级测评师
    20210104 递归
    20201231-3 字符编码转换详解1
    20201231-2 元组
    20201231-1 购物车程序练习实例
    20201230-3 bytes数据类型
    20201230 python数据类型
    20201230 pyc是什么
    20201230-1 网络基础知识
  • 原文地址:https://www.cnblogs.com/Miracevin/p/10394461.html
Copyright © 2020-2023  润新知