【做题记录】CF993E Nikita and Order Statistics
-
\(\text{CF993E\ Nikita\ and\ Order\ Statistics}\)
- 算法;\(\text{FFT}\)
题目:
给你一个数组 \(a_{1 \sim n}\),对于 \(k = 0 \sim n\),求出有多少个数组上的区间满足:区间内恰好有 \(k\) 个数比 \(x\) 小。\(x\) 为一个给定的数。
\(n \le 2 \times 10^5\)。值域没有意义。
题解:
设 \(b_i\) 表示 \(a_i\) 是否小于 \(x\),小于则值为 \(1\),否则为 \(0\)。
对 \(b\) 做一个前缀和,设为 \(s\)。
所以相当于求对于 \(k=0\sim n\) 使 \(s_i-s_j=k(i,j\in [0,n])\)
对于 \(s\) 数组开个桶 \(p\) ,\(p_i\)记录 \(s\) 中有多少个 \(i\)
那么对于 \(k\) 来说在 \([0,n]\) 中枚举每一个长度为 \(k\) 的区间
\[\therefore ans_k=\sum_{i=0}^{n-k}p_i\times p_{i+k}
\]
那么对于这个可以卷积。
设 \(f_i=p_i,g_{n-i}=p_i\),将 \(f,g\) 卷一下,其卷积设为 \(h_i\)
\[\therefore \sum_{i=0}^{n-k}f_i\times f_{i+k}=\sum_{i=0}^{n-k}f_i\times g_{n-i-k}=h_{n-k}
\]
\[\therefore ans_k=h_{n-k}
\]
所以将 \(f,g\) 一卷就好了。
记得特判一下 \(k=0\)。