• 【NOIP2013模拟】终极武器(经典分析+二分区间)


    No.2. 【NOIP2013模拟】终极武器
    • 题意:

      • 给定你一些区间,然后让你找出(1sim 9)中的等价类数字.
      • 也就是说在任何一个区间里的任何一个数,把其中后(k)位中的某一位换成等价类数字,仍然在某个区间中。
      • (nle 10^5, kle 18)
    • 据说这是一道防AK题,考场上能拿到满分确实是比较困难的.

    • 要有耐心的推,先从简单情况入手.

    • 这里给出详细的题解:

    • 因为要判断等价类数字,所以我们可以用一个矩阵(a[i][j]=1)表示(i,j)是等价的,否则不等价.

    • 此时例如我要判断(12345sim 12378)中的等价类数字,这个比较容易,假设(k=3),则当我枚举倒数第(3)位时,注意到(l,r)的前三位都相同,此时我只需要判断把(3)改成(x)之后(12x45sim 12x78)是否都出现且出现在在同一个区间中.

    • 如何判断一个区间(l,r)是否出现在同一区间?

    • 我们可以把多个区间首尾合并一下,因为保证了区间没有交集,所以可以直接二分一下(l,r)所在区间,判断是否相同即可.

    • 解决完这个问题之后,我们就可以完美解决上面的例子.

    • 但如果是区间(12345sim 12758)呢?此时枚举到第(3)位时,会发现,区间(3sim 7)都是第(3)位原本存在的数.

    • 所以我们需要先枚举第(3)位原本的数,然后再枚举换成什么数,看一下是否出现在对应区间里.

    • 可以分成三类,即(3,4sim 6,7),出现的区间分别是(45sim 99, 0sim 99, 0sim 58).

    • 但还有第三种情况,例如(12345sim 78543),此时假设依然枚举第(3)位,会发现,前两位的数都不相同。

    • 这时,需要仔细观察,会发现,其实(13[][][] sim 77[][][])这些位上的数是没任何用的,因为不管你倒数第三位怎么改,前两位已经出现在区间中,所以这样的改动是没有任何意义的,所以我们也不需要判断.

    • 然后问题就转化为判断(12345sim 12999)以及(78000sim 78543)这两段区间了.

    • 于是又转化为之前熟悉的问题.

    • 至此,本题完美解决,总结一下,用到了两个套路:

      • 用矩阵表示等价类.
      • 用二分判断区间是否出现,合并区间的思想很重要.
  • 相关阅读:
    ASP.NET提供文件下载函数
    web.config access数据库相对路径设置方法 for asp.net2.0
    MSDE安装后身份验证自动是windows验证,osql命令中修改为sqlserve身份验证或混合验证呢及注冊表修改方法
    关于ASP.NET IIS的注册:
    指定datagrid编辑框的宽度及相映属性(转)备用
    TransparentListBox
    在dll中使用FastReport会遇到以下内个问题
    值得学习一
    注册表恢复默认共享
    有关dnn的安装不成功问题
  • 原文地址:https://www.cnblogs.com/Pro-king/p/9383485.html
Copyright © 2020-2023  润新知