Codeforces 2064 F

题目大意:

给定 \(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)\)

我没想到的点:

  1. 将原问题转化成区间有没有交,可以这么做的原因是他只被两侧的 min/max 影响。
  2. 我会算重,如果强定 \(\max\) 是最左边的,\(\min\) 是最右边的,那么还是会算重,因为你在写的时候,比如第二个样例,同一个 \(r\) 会算多次,但强定他 \(\min\) 是最左的,\(\max\) 是最右的,那么就不会算重,因为对于一个相同的 \(r\),只会被加一次。
posted @ 2025-03-24 23:24  positive_deviation  阅读(14)  评论(0)    收藏  举报