预处理的方案很多,但各有利弊。
比如,在这道题中,如果使用线段树来做预处理,需要维护三个值:区间内最小值、最大值、数的个数。
这种办法有个缺点,当Hi的值很大时,有可能会内存开销过大,导致空间超限。
根据规定,程序可以使用的内存只有128兆,一旦使用的内存超出限制,则整道题0分。
为了解决这个问题,就需要进行离散化操作,平添难度。
江寒通过分析,综合比较、权衡了一番后,选择了比较保险的双向链表模拟算法。
相比线段树,双向链表不需要离散化,但是细节比较多,调试起来会稍微麻烦一点。
江寒自然不怕这点麻烦,一个是他对双向链表掌握得很好,二来……早上吃那么多东西,就是为了用在这种地方的。
只要舍得全力开动脑力,编写起这种复杂度的代码来,只是小意思。
还剩下一个半小时,时间上是完全够用的。
对输入数据进行了预处理之后,接下来就可以寻求题目要求的解答了。
这一步,可以用“倍增法”进一步提速,这样就可以保证,在很短的时间内算出答案,避免时间超限。
由于答案数字很大,这道题也要用高精度来处理一下。
但和第二题又有点不一样,这道题的精度压力,其实并没有那么离谱,完全可以尝试采用longlong(对应着vs里的int64)数据类型来解决。
如果为了万无一失或者炫技,当然也可以再次手写一个高精度算法。
但江寒经过分析、计算,认为longlong已经完全够用,就没费那个劲儿。
放在几年前,在NOIP等各种编程比赛中,longlong还是禁止使用的数据类型,但从去年开始,NOI官方终于放松了限制,明文允许使用了。
这样一来,很多难题的编程复杂度,就被大大地削减了。
编写完第三题的代码,调试通过后,江寒又设计了一些数据去检测,结果完全正确。
看看时间,还剩下半个小时。
这个时间自然也不能浪费,江寒将代码整理了一番,清理掉调试数据,注释掉不需要的输出,删除多余的文件。
最后,再跑了一遍代码,确认毫无问题后,又利用最后十分钟,复查了一遍文件夹、源代码、输入输出文件的命名,排除各种低级错误。
别说,还真让江寒查出了一个问题,第1题的输出文件名,打漏了一个字母。
应该是vigenere.out,结果打成了vigener.out。
这可不是什么小问题,如果没查出来,就是致命错误。
如果文件名弄错了,程序编得再完美,也只能爆0!
每年都有不少“大神”级别的高手,折在这种低级错误上。
好在江寒的时间非常宽裕,这才能及时发现并纠正。
不过,等到明天进行Day2比赛时,就要吸取教训了。
江寒默默地想着。
像是这样的地方,最好从题目中直接复制、粘贴过来,不要再手打……
一切梳理妥当后,时间也差不多了,还剩最后两分钟。
江寒举手示意。
监考教师走了过来:“什么事?”
“交卷。”江寒轻声回答。
顿时,刷刷刷,许多目光扫了过来。
因为机器摆放的问题,没有人可以看到别人的屏幕。
可是,能看到脸色啊。
发现江寒一脸的云淡风轻,那些人顿时就心里明镜,这只怕是一位真大神。
也只有真正的竞赛高手,才会时间充裕到这种程度,不等比赛结束铃声响起,监考教师喊停,就主动交卷。
监考教师核对了一下江寒的答题文件夹,然后就示意他可以离场了。
这就是NOIP比赛比较人性化的地方了。
比赛时间截止后,所有选手只需有秩序离场,别的什么也不用管。
监考者会负责收集答案。
当然,他们也只会在权限内进行上传操作,不会帮忙修改任何一个字母、标点符号。