【做题记录】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\)

posted @ 2022-01-07 19:31  trsins  阅读(26)  评论(0编辑  收藏  举报