洛谷P3722 [AH2017/HNOI2017]影魔

正解:

解题报告:

传送门!

先理解一下这道题,大概是这样儿的:

对于一个点对,如果他们的两端是这段区间的最大值和次大值,那么他们会有p1的贡献

如果他们的两端是最大值和一个非次大值,那么他们会有p2的贡献

问[a,b]内部的点对贡献之和

首先考虑到,两种贡献都要有一个共同点——有最大值

那看到最大值就应该想到单调栈嘛,然后就可以想到,能不能在维护单调栈的时候顺便把答案求出来了 ?

显然是可以的嘛QwQ

那就大力分类讨论一波咯

首先对询问离线,按照右端点排序,然后就直接加入

设现在加入的数是i,对于中的第j个元素,有这么几种可能

扫描二维码关注公众号,回复: 5269284 查看本文章

1)ai>aj

考虑到这是一个单调减的,显然这个情况下,点对(i,j)的贡献为p1(它们内部的点对会在后面讨论的不要管QAQ

2)ai<aj

内部又要分类讨论昂

首先如果ai<aj+1

依然是(i,j)的贡献为p1

然后就考虑计算内部的贡献

对于内部的贡献,看到前面的第一种情况,发现对于j之后的单调栈上的点都已经计算过了,贡献为p1,所以就是j点之后的非栈中的点会和i有p2的贡献

那如果ai>aj+1

那就从j到其之后的所有点对都会和它有p2的贡献

再仔细思考一下,对于第一种情况,单点修改就好,对于第二种情况的第二小点,区间修改就好

但是对于第二种情况的第一小点,操作起来就很麻烦,还要搞484栈中的点之类的玩意儿,就很麻烦

所以不难想到直接在第一种情况中把贡献改成p1-p2,这样第二种情况中的第一小点就能直接做了,全部加上就好

然后就做完辣,,,?可能下午放代码趴QAQ

猜你喜欢

转载自www.cnblogs.com/lqsukida/p/10416743.html