正解:
解题报告:
先理解一下这道题,大概是这样儿的:
对于一个点对,如果他们的两端是这段区间的最大值和次大值,那么他们会有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