个人认为是day1最难的一道题。
用单调栈/链表找到一个元素i往左/右的第一个大于它的数,设为l[i],r[i]
题目要枚举区间不好做,改为枚举中间的最大值。设位置为i。
实际上,如果一个区间的左/右端点都在([l[i]+1,i-1]/[i+1,r[i]-1])内,那么根据题意无法对答案产生贡献。
如果一个区间的左/右端点恰有1个在([l[i]+1,i-1]/[i+1,r[i]-1])内,会对答案产生p2的贡献。设为1/2类贡献。
如果一个区间的左/右端点为l[i]/r[i],会对答案产生p1的贡献。设为3类贡献。
p1贡献直接使用二维数点即可。现在要考虑p2贡献。
对于1/2类贡献,把所有询问按照l[i]/r[i]一起排序。询问排序的关键字设为x
实际上,p2的贡献贡献的是一个区间。
把每个询问拆成两个前缀相减。
在遇到修改操作时,在对应的区间+p2,每次查询的时候对于询问查询区间即可。
这样子是正确的,是因为当一个询问在l-1处未被插入,但是在r处被插入,当前询问的区间会包含贡献。
当一个询问在l-1/r处被/未被插入,则当前询问的区间未包含贡献。