[BalticOI 2014 Day1] Sequence

发布时间 2023-07-22 00:12:20作者: 谭皓猿

[BalticOI 2014 Day1] Sequence

题意

现在有 \(K\) 个连续整数,每个整数你只能看见其中一位数字,求最开始的数 \(N\) 的最小值。

题解

考试的时候一眼原,但是没补题,很痛苦。

注意到答案肯定不会超过 \(102345678900000\)
观察这个东西会发现答案的组成一定是这样的:高位不变,低位变。

所以我们通过枚举低位来确定高位的方式写出一个暴力:
枚举首项 \(a_1\) ,递推出后面的数字,找到那些数字不符合限制,把需要的数字排个序加在前面。

显然这样做事 \(O(n^2)\) 的。

考虑优化,直接嗯枚举太搞了,所以我们考虑从低位一位一位地枚举首位。
先从最低位开始做,我们只考虑当前位对于限制的贡献,枚举首位的最低位,递推出后面的最低位,所以我们就知道每个数字所需要的位置。

显然还需要的数字需要高位来填补,接着就枚举下一位。
注意到对于下一位来说解除限制对应的是一段区间。
考虑快速做贡献,直接对一整段做解除限制,所以说当前位每进一次位就新开一组,把高位相同的数字的限制合并成一组。

然后所有的限制都变成了一组一组的,不同的是最开始每个位置限制只有 \(1\) 个,而合并了之后可能就不止一个了。

容易发现做法还是一样的,这样就进入了一个子问题。

当最后只有一组限制的时候就找到需要的数字排序加入即可,关于 \(0\) 还有一堆细节要处理。
每一层分治限制组数大概变为原来的 \(\frac{1}{10}\) ,容易发现时间复杂度为 \(O(nlogn)\)
code

..

感觉这道题最重要的地方就是想到高位不变并枚举低位
然后从低位枚举与合并限制还是比较人类智慧的。