这道题的题目大意就是说一个人要到一段死胡同去推销,拜访第i个门户会消耗a[i]体力,走路也会消耗一些体力,第i个门户距离胡同口的距离是s[i],然后让你输出在不多余走路的情况下拜访1户(x==1),拜访2户(x==2)......拜访n(x==n)户分别最多要消耗多少体力。
初看这道题自己感觉没有任何头绪,于是反复读样例,发现这道题有一定的规律,当x==1时,答案就是最大的s[i]*2+a[i],这个值可以在输完s[i]的时候就判断出来。其中s[i]*2的原因是在死胡同里面走的时候,如果你要走到s[i]的深度且不走多余的路,那么从进去到出来你一定会走2*s[i]的路程,对吧?
那么此时我们已经有了x==1的答案,那么可以猜测我们是不是可以通过x==1来推出x==2,x==3乃至x==n的答案来呢?
首先,可以暴力枚举......不过一看数据规模,n<=100000,简直了,还是算了吧......
然后,继续反复读样例说明,每次x的值增加1的时候,一定会多走一个门户(其实这是一句废话),那么根据这条性质,我们需要多走的那个门户一定就是当前的未走的门户中耗费体力值最大的。ans[i]=ans[i-1]+max(门户消耗的体力),一定是这样的吧?那么,我们是不是可以每当x循环增加1以后,都找出当前还没走的门户消耗体力的最大值,也就是找出max(门户消耗的体力)......嗯,一定是这样......
可是每次这样找最大值就成了O(n^2)的复杂度,明显还是爆......那