题目大意:
给定 \(n, m\) 与数组 \(a\),请问有多少个 \(l,r\) 满足,存在一个 \(k\),使得:
\[\min_{i = l}^{k} a_{i} + \max_{i = k + 1}^{r} a_{i} = m
\]
\(1 \le n \le 2 \times 10^5\)。
解题思路:
感觉挺好的一个题,因为比较难做到不重不漏。
首先考虑对于每个 \(x\),求出他左边第一个比他大的和右边第一个大于等于他的。
然后求出他左边第一个小于等于他的,和右边第一个小于他的。
那么现在相当于求每一对最大值和最小值构成的区间的贡献之和。
那么用树状数组对于每个 \(x, m-x\) 从前往后扫一遍,然后用树状数组维护一下即可。
注意判的时候是 \(minnr_{i} + 1 \ge maxnl_{j}\),因为这时是有分割方式的。
\(O(n \log n)\)。
我没想到的点:
- 将原问题转化成区间有没有交,可以这么做的原因是他只被两侧的 min/max 影响。
- 我会算重,如果强定 \(\max\) 是最左边的,\(\min\) 是最右边的,那么还是会算重,因为你在写的时候,比如第二个样例,同一个 \(r\) 会算多次,但强定他 \(\min\) 是最左的,\(\max\) 是最右的,那么就不会算重,因为对于一个相同的 \(r\),只会被加一次。