题面:
比赛时就差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
日常中二
“我重临世界之日,众逆臣皆当死去!”
“我们的火……要把整个世界……都给点燃!”
“我们都是小怪兽,总有一天会被正义的奥特曼打倒。”
“小白,待你长发及腰,嫁我可好?”
“前进!前进!不择手段地前进!”
“这个世界很美好,可是对我却并不温柔。”
“为了你,我可以创造整个世界,也可以毁灭整个世界!”
“以九幽之躯,执天道之权柄!”
“你有你在乎的人,可我也有啊……你说好不杀她的……”
“我们在世上边看繁花,边朝那地狱行去。”
“或许在某天夜里,你会无端地想起一个人,他曾让你对明天有所憧憬,却不曾出现在你的明天里。”
“凡王之血,必以剑终!”