您的位置:首页 > 其它

NOIP2015 PJ T3,T4 题解

2016-04-22 12:12 253 查看

Sum

Description

一条狭长的纸带被均匀划分出了n个格子,格子编号从 1 到 n。每个格子上都染了一种颜色colori(用[1,m]当中的一个整数表示),并且写了一个数字numberi。

定义一种特殊的三元组:(x,y,z),其中 x,y,z都代表纸带上格子的编号,这里的三元组要求满足以下两个条件:

x,y,z都是整数, x<y<z,y−x=z−y

colorx=colorz



满足上述条件的三元组的分数规定为(x+z)×(numberx+numberz)。整个纸带的分数规定为所有满足条件的三元组的分数的和。这个分数可能会很大,你只要输出整个纸带的分数除以 10,007所得的余数即可。

Solution

40%

且color[z]=color[x],x与z的奇偶性相同

暴力就好

复杂度O(N2)

70%

表示不知道这个部分分有什么用

100%

考虑优化

对于每个x,z我们可拆解一下公式

x×num[x]+z×num[z]+x×num[z]+z×num[x]

对于每个z,我们可以边做边累加与他合法的前缀和,再加上就好了。

复杂度O(N)

Salesman

Description

阿明是一名推销员,他奉命到螺丝街推销他们公司的产品。螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户。螺丝街一共有 N 家住户,第 i 家住户到入口的距离为 Si 米。由于同一栋房子里可以有多家住户,所以可能有多家住户与入口的距离相等。阿明会从入口进入,依次向螺丝街的 X家住户推销产品,然后再原路走出去。

阿明每走 1 米就会积累 1 点疲劳值,向第 i 家住户推销产品会积累 Ai点疲劳值。阿明是工作狂,他想知道,对于不同的 X,在不走多余的路的前提下,他最多可以积累多少点疲劳值。

Solution

我们可以考虑贪心

因为我们走路所需要的疲劳值,就是走到最右边那户人的疲劳值,左边所有的对他都没有影响。

我们设最右边的为last

显然这个last把整条街分成了左右两部分,一部分是走路疲劳值没有影响的,一部分是有影响的。

可以看出,随着X的增大,最优的$last¥一定是单调不减的。

因为他这个last是我们综合两边最优的值选出来的,选别的一定没有他优。

如果有多个相同的值,我们完全可以贪心的选择最左边的那一个。因为他对以后答案的影响最小(其实都一样),也保持了last的单调不减性

我们可以用两个堆分别维护最大值,每做一个X,看看新取的这个在左边还是在右边,如果在左边就把ans加上,再把他总左边堆里删除。如果在右边,就加入答案,并且把last修改为这个数。此时,我们使得从旧last+1到新last−1这部分变成了走路疲劳值没有影响的,所以我们可以把其中每个数都从右边的堆删除,加入左边的堆就好了。

堆的复杂度是O(logN)的,然后枚举X是O(N),然后所有的改变last中的操作全部加起来是O(N),复杂度就是O(2NlogN)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: