Description

给你一个数组 $a_{1 \sim n}$,对于 $k = 0 \sim n$,求出有多少个数组上的区间满足:区间内恰好有 $k$ 个数比 $x$ 小。$x$ 为一个给定的数。

Input

第一行$n,x$。

第二行给出$n$个数

Output

一行答案。

Sample Input1

5 3
1 2 3 4 5

Sample Output1

6 5 4 0 0 0

Sample Input2

2 6
-5 9

Sample Output2

1 2 0

Sample Input3

6 99
-1 -1 -1 -1 -1 -1

Sample Output3

0 6 5 4 3 2 1

Solution

为什么这个题网上大部分题解分析来分析去我都看不懂啊……QAQQQ

感觉我的理解能力还是太渣了……

首先我们把小于$x$的置为$1$,否则置为$0$,然后求一个前缀和,并把这些前缀和安排到一个桶里面。

记这个桶为$f[i]$,表示前缀和$=i$的个数。

假设我们枚举$i=0 \sim n$,来代表$k$,那么对于一个$i$来说,它的答案就是

$\sum_{j=0}^{n}f[j]*f[j+i]$。然后这玩意儿就是套路了,设$g[n-j]=f[j]$,

就成了$\sum_{j=0}^{n}g[n-j]*f[j+i]$,$FFT$卷一下就好了。

注意当$k=0$时,会有$n+1$次自己和自己算到一起的情况,减掉这种情况然后再除$2$就好了。

为什么要除$2$因为两个前缀和如果相同的话就会$a$和$b$算一次,$b$和$a$算一次……

Code

 #include<iostream>
#include<cstdio>
#include<cmath>
#define N (800009)
#define LL long long
using namespace std; int n,x,fn,l,tmp,r[N],cnt[N],sum[N];
LL ans[N]; double pi=acos(-1.0);
struct complex
{
double x,y;
complex(double xx=,double yy=)
{
x=xx; y=yy;
}
}a[N],b[N]; complex operator + (complex a,complex b) {return complex(a.x+b.x,a.y+b.y);}
complex operator - (complex a,complex b) {return complex(a.x-b.x,a.y-b.y);}
complex operator * (complex a,complex b) {return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
complex operator / (complex a,double b) {return complex(a.x/b,a.y/b);} void FFT(int n,complex *a,int opt)
{
for (int i=; i<n; ++i)
if (i<r[i]) swap(a[i],a[r[i]]);
for (int k=; k<n; k<<=)
{
complex wn=complex(cos(pi/k),opt*sin(pi/k));
for (int i=; i<n; i+=k<<)
{
complex w=complex(,);
for (int j=; j<k; ++j,w=w*wn)
{
complex x=a[i+j],y=w*a[i+j+k];
a[i+j]=x+y; a[i+j+k]=x-y;
}
}
}
if (opt==-) for (int i=; i<n; ++i) a[i]=a[i]/n;
} int main()
{
scanf("%d%d",&n,&x);
cnt[]++;
for (int i=; i<=n; ++i)
{
scanf("%d",&tmp);
sum[i]=sum[i-]+(tmp<x); cnt[sum[i]]++;
}
for (int i=; i<=n; ++i)
a[i].x=b[n-i].x=cnt[i];
fn=;
while (fn<=*n) fn<<=, l++;
for (int i=; i<fn; ++i)
r[i]=(r[i>>]>>) | ((i&)<<(l-));
FFT(fn,a,); FFT(fn,b,);
for (int i=; i<fn; ++i)
a[i]=a[i]*b[i];
FFT(fn,a,-);
for (int i=; i<=n; ++i)
ans[i]=(LL)(a[n+i].x+0.5);
for (int i=; i<=n; ++i)
printf("%lld ",(i==)?((ans[i]-n-)/):(ans[i]));
}

CF993E:Nikita and Order Statistics(FFT)的更多相关文章

  1. CF993E Nikita and Order Statistics 【fft】

    题目链接 CF993E 题解 我们记小于\(x\)的位置为\(1\),否则为\(0\) 区间由端点决定,转为两点前缀和相减 我们统计出每一种前缀和个数,记为\(A[i]\)表示值为\(i\)的位置出现 ...

  2. Codeforces 993E Nikita and Order Statistics [FFT]

    洛谷 Codeforces 思路 一开始想偏想到了DP,后来发现我SB了-- 考虑每个\(a_i<x\)的\(i\),记录它前一个和后一个到它的距离为\(L_i,R_i\),那么就有 \[ an ...

  3. CF993E Nikita and Order Statistics

    小于x的赋值为1,否则为0 区间等于k的个数 求0~n连续的n+1个k? N<=1e5? FFT! 考虑卷积建模:用下标相加实现转移到位,数值相乘类比乘法原理! 法一: 分治,然后FFT没了 法 ...

  4. CF993E Nikita and Order Statistics 多项式卷积 快速傅里叶变换

    题意: 给你一个数组a1~an,对于k=0~n,求出有多少个数组上的区间满足:区间内恰好有k个数比x小.x为一个给定的数.n<=10^5.值域没有意义. 分析: 大神们都说这道题是一个套路题,真 ...

  5. [Codeforces 993E]Nikita and Order Statistics

    Description 题库链接 给你一个长度为 \(n\) 的序列 \(A\) ,和一个数 \(x\) ,对于每个 \(i= 0\sim n\) ,求有多少个非空子区间满足恰好有 \(i\) 个数 ...

  6. CLRS:median and order statistics

    //maximum and minimum     暴力遍历 O(n) //i-th element dicide and conquer random_selected_partition     ...

  7. Data Structure Binary Search Tree: Find k-th smallest element in BST (Order Statistics in BST)

    http://www.geeksforgeeks.org/find-k-th-smallest-element-in-bst-order-statistics-in-bst/ #include < ...

  8. cf22A Second Order Statistics(STL-UNIQUE的使用)

    题意: N个数,找出第二大的数.如果没有输出-1. 思路: UNIQUE的使用. 代码: int a[105]; int n; int main(){ cin>>n; rep(i,0,n- ...

  9. FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅰ

    众所周知,tzc 在 2019 年(12 月 31 日)就第一次开始接触多项式相关算法,可到 2021 年(1 月 1 日)才开始写这篇 blog. 感觉自己开了个大坑( 多项式 多项式乘法 好吧这个 ...

随机推荐

  1. Storm框架:如何消费RabbitMq消息(代码案例)

    1.定义拓扑topology public class MessageTopology { public static void main(String[] args) throws Exceptio ...

  2. UNIX 高手的另外 10 个习惯

    让我们面对现实吧:坏习惯很难改变.但是您已经熟悉的习惯可能更难克服.有时,重新审视某些事情可能让您遇到“啊哈,我没想到它能做到这一点!”的时刻.在 Michael Stutz 的优秀文章“UNIX 高 ...

  3. jquery之Ajax(一)

    1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中. url (String) : 请求的HTML页的URL地址. data (M ...

  4. vs2017 + Python3.6 +Django1.11 连接mysql数据库

    不废话直接来. vs2017创建一个新的python web项目之后默认链接数据库是sqlite.但是我就想连接到Mysql 上面玩,于是开始倒腾了.下面是步骤 1.修改settings.py 文件需 ...

  5. html5中高德、腾讯、百度 地图api调起手机app

    html 部分 <div id="mapBg"> <div class="mapTab"> <a href="" ...

  6. JavaScript try-catch语句(错误处理)

    错误处理在处理程序设计中的重要性是毋庸置疑的,任何有影响力的web应用程序都需要一套完善的错误处理机制.当然,大多数佼佼者确实做到了这一点,但通常只有服务器端应用程序才能做到如此.实际上,服务器端团队 ...

  7. Pig foreach用法举例

    foreach:一行一行的遍历数据,处理一行的数据,然后返回一个tuple. users = load '/users.data';   1)别名引用 f = foreach users genera ...

  8. 使用dva脚手架(dva-cli)快速构建React项目

    安装 dva-cli 你应该会更希望关注逻辑本身,而不是手动敲入一行行代码来构建初始的项目结构,以及配置开发环境. 那么,首先需要安装的是 dva-cli .dva-cli 是 dva 的命令行工具, ...

  9. linux/OSX中“DD”命令制作ISO镜像操作系统安装U盘

    linux或者OS X系统中,使用“dd”命令可以直接在终端命令行模式下,制作ISO镜像的系统安装盘. 一.linux系统以centOS7为例. sudo dd if=镜像路径 of=USB设备路径 ...

  10. C语言const与#define

    const 定义的是变量不是常量,只是这个变量的值不允许改变是常变量!带有类型.编译运行的时候起作用存在类型检查. define 定义的是不带类型的常数,只进行简单的字符替换.在预编译的时候起作用,不 ...