[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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步