5871. 【NOIP2018模拟9.15】挑战

本文解析了一道算法竞赛题目,讨论了如何通过动态维护前缀和来解决1~n个非负整数在多次修改后,快速找到满足特定条件的位置t的方法。通过对修改位置的前后判断,利用二分搜索和线段树优化查找过程,实现了O(mlog^2n)的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题面:

比赛时就差30秒就能把满分程序交上去了,我还能说什么好……

题解:

题意是1~n个非负整数有m次修改,每次修改后求出一个最小的位置t,使得sum[1~t-1]=p[t]。

假设当前修改的位置x在上次得出的答案位置的后面,那么答案不变,对吧?
那么假设位置x在上次得出的答案位置的前面,这次的答案就要重新计算了。 此时这次答案若存在,则一定在x~n范围内。

我们在x~n范围内找到一个最靠前的位置t,使得t上面的值要大于等于sum[1~x-1]。因为如果t要是史前最大毒瘤,则p[t]是要等于sum[1~t-1],所以p[t]一定要满足大于等于sum[1~x-1]。(这里之所以有等于是因为t有可能就在位置x)

找到了t以后,我们判断t是否是史前最大毒瘤(即t是否等于sum[1~t-1]),如果是,就是答案了,如果不是,则答案区间变成了t+1~n,我们再找下一个t‘

t’要满足大于sum[1~t]的且最靠前的。(之所以不让t'一次性就大于等于sum[1~t'-1]是因为这样真的做不到)

然后我们把找出的t'判断是否是答案,如果是就输出,如果不是就继续找下一个t'',以此类推。

 

算一下时间复杂度。

每次找t可以用logn(我不会,想知道的可以去问问其他过的dalao)或者logn^2的时间(二分套线段树)。

至于有多少个t嘛,最多只可能有log(10^9)个,为什么呢?因为是类似前缀和的,所以每个sum[1~t]相当于至少是前面sum[1~t-1]的2倍。至于p有0的情况嘛,讲题的时候我被一群dalao带偏了,其实现在想想有很多0也没关系啊,t肯定不会在0上,那不是直接跳过的吗。 如果全部都是0,那答案是1直接稍微判断一下使t不会一个一个往下枚举就好了。

 

所以,综上,时间复杂度是O(能过)呸应该是O(mlog^2)。

Over。

 

客官,点个赞再走可好啊?QwQ

 

日常中二

“我重临世界之日,众逆臣皆当死去!”

“我们的火……要把整个世界……都给点燃!”

“我们都是小怪兽,总有一天会被正义的奥特曼打倒。”

“小白,待你长发及腰,嫁我可好?”

“前进!前进!不择手段地前进!”

“这个世界很美好,可是对我却并不温柔。”

“为了你,我可以创造整个世界,也可以毁灭整个世界!”

“以九幽之躯,执天道之权柄!”

“你有你在乎的人,可我也有啊……你说好不杀她的……”

“我们在世上边看繁花,边朝那地狱行去。”

“或许在某天夜里,你会无端地想起一个人,他曾让你对明天有所憧憬,却不曾出现在你的明天里。”

“凡王之血,必以剑终!”

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值