No.2. 【NOIP2013模拟】终极武器
- 题意:
- 给定你一些区间,然后让你找出\(1\sim 9\)中的等价类数字.
- 也就是说在任何一个区间里的任何一个数,把其中后\(k\)位中的某一位换成等价类数字,仍然在某个区间中。
- \(n\le 10^5, k\le 18\)
据说这是一道防AK题,考场上能拿到满分确实是比较困难的.
要有耐心的推,先从简单情况入手.
这里给出详细的题解:
因为要判断等价类数字,所以我们可以用一个矩阵\(a[i][j]=1\)表示\(i,j\)是等价的,否则不等价.
此时例如我要判断\(12345\sim 12378\)中的等价类数字,这个比较容易,假设\(k=3\),则当我枚举倒数第\(3\)位时,注意到\(l,r\)的前三位都相同,此时我只需要判断把\(3\)改成\(x\)之后\(12x45\sim 12x78\)是否都出现且出现在在同一个区间中.
如何判断一个区间\(l,r\)是否出现在同一区间?
我们可以把多个区间首尾合并一下,因为保证了区间没有交集,所以可以直接二分一下\(l,r\)所在区间,判断是否相同即可.
解决完这个问题之后,我们就可以完美解决上面的例子.
但如果是区间\(12345\sim 12758\)呢?此时枚举到第\(3\)位时,会发现,区间\(3\sim 7\)都是第\(3\)位原本存在的数.
所以我们需要先枚举第\(3\)位原本的数,然后再枚举换成什么数,看一下是否出现在对应区间里.
可以分成三类,即\(3,4\sim 6,7\),出现的区间分别是\(45\sim 99, 0\sim 99, 0\sim 58\).
但还有第三种情况,例如\(12345\sim 78543\),此时假设依然枚举第\(3\)位,会发现,前两位的数都不相同。
这时,需要仔细观察,会发现,其实\(13[][][] \sim 77[][][]\)这些位上的数是没任何用的,因为不管你倒数第三位怎么改,前两位已经出现在区间中,所以这样的改动是没有任何意义的,所以我们也不需要判断.
然后问题就转化为判断\(12345\sim 12999\)以及\(78000\sim 78543\)这两段区间了.
于是又转化为之前熟悉的问题.
-
至此,本题完美解决,总结一下,用到了两个套路:
- 用矩阵表示等价类.
- 用二分判断区间是否出现,合并区间的思想很重要.