[BalticOI 2014 Day1] Sequence

[BalticOI 2014 Day1] Sequence

题意

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

题解

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

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

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

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

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

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

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

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

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

..

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

本文作者:谭皓猿

本文链接:https://www.cnblogs.com/snow-panther/p/17572684.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   谭皓猿  阅读(30)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起