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

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #define N (800009)
 5 #define LL long long
 6 using namespace std;
 7
 8 int n,x,fn,l,tmp,r[N],cnt[N],sum[N];
 9 LL ans[N];
10
11 double pi=acos(-1.0);
12 struct complex
13 {
14     double x,y;
15     complex(double xx=0,double yy=0)
16     {
17         x=xx; y=yy;
18     }
19 }a[N],b[N];
20
21 complex operator + (complex a,complex b) {return complex(a.x+b.x,a.y+b.y);}
22 complex operator - (complex a,complex b) {return complex(a.x-b.x,a.y-b.y);}
23 complex operator * (complex a,complex b) {return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
24 complex operator / (complex a,double b) {return complex(a.x/b,a.y/b);}
25
26 void FFT(int n,complex *a,int opt)
27 {
28     for (int i=0; i<n; ++i)
29         if (i<r[i]) swap(a[i],a[r[i]]);
30     for (int k=1; k<n; k<<=1)
31     {
32         complex wn=complex(cos(pi/k),opt*sin(pi/k));
33         for (int i=0; i<n; i+=k<<1)
34         {
35             complex w=complex(1,0);
36             for (int j=0; j<k; ++j,w=w*wn)
37             {
38                 complex x=a[i+j],y=w*a[i+j+k];
39                 a[i+j]=x+y; a[i+j+k]=x-y;
40             }
41         }
42     }
43     if (opt==-1) for (int i=0; i<n; ++i) a[i]=a[i]/n;
44 }
45
46 int main()
47 {
48     scanf("%d%d",&n,&x);
49     cnt[0]++;
50     for (int i=1; i<=n; ++i)
51     {
52         scanf("%d",&tmp);
53         sum[i]=sum[i-1]+(tmp<x); cnt[sum[i]]++;
54     }
55     for (int i=0; i<=n; ++i)
56         a[i].x=b[n-i].x=cnt[i];
57     fn=1;
58     while (fn<=2*n) fn<<=1, l++;
59     for (int i=0; i<fn; ++i)
60         r[i]=(r[i>>1]>>1) | ((i&1)<<(l-1));
61     FFT(fn,a,1); FFT(fn,b,1);
62     for (int i=0; i<fn; ++i)
63         a[i]=a[i]*b[i];
64     FFT(fn,a,-1);
65     for (int i=0; i<=n; ++i)
66         ans[i]=(LL)(a[n+i].x+0.5);
67     for (int i=0; i<=n; ++i)
68         printf("%lld ",(i==0)?((ans[i]-n-1)/2):(ans[i]));
69 }

转载于:https://www.cnblogs.com/refun/p/10097284.html

CF993E:Nikita and Order Statistics(FFT)相关推荐

  1. CF993E Nikita and Order Statistics

    CF993E Nikita and Order Statistics 题意: 给你一个数组 a1∼na_{1 \sim n}a1∼n​,对于 k=0∼nk = 0 \sim nk=0∼n,求出有多少个 ...

  2. CodeForces - 993E Nikita and Order Statistics

    (暂时没有vjudge题面,CF的题面又太丑2333,直接口述了) 题目大意:给你一个长度为n的序列a[],和一个数x,对于每个i= 0~n ,求有多少个子区间满足恰好有i个数<x. sol: ...

  3. Lecture 6 Order Statistics

    Given n elements in array, find kth smallest element (element of rank k) Worst-case linear time orde ...

  4. order statistics(找最ith小数值)问题

    order statistics就是在一堆无序的序列中查找第n小元素. 分为2种: 1.静态,也就是序列给定,并且不再变化,此时采取类似快排的做法,需要改变判断条件和结束条件. 2动态,就是元素在不断 ...

  5. CF22A Second Order Statistics

    Second Order Statistics (CF22A) 题解 这是一道CF的题目(Code Forces 22A) 题目(英文): Once Bob needed to find the se ...

  6. A. Second Order Statistics(sort 水题)

    AC代码如下: #include<iostream> #include<algorithm> #include<string> using namespace st ...

  7. CodeForces - 22A Second Order Statistics【水题】

    题目链接:https://codeforces.com/contest/22/problem/A #include <iostream> #include <vector> # ...

  8. 算法成长之路------CF22A Second Order Statistics

    学习目标:算法学习-Day16 题库: 洛谷题库 每天保持发布一篇Java或C算法题解! 题目: 给定一个数组,输出其中第二小的整数(相等的整数只计算一次). 输入格式: 第一行,一个整数 n(1≤n ...

  9. FFT/NTT/FMT/FWT题目

    快速傅里叶变换FFT hdu4609 3-idiots P4173 残缺的字符串 Hash Function [AH2017/HNOI2017]礼物 CF993E Nikita and Order S ...

最新文章

  1. 离职后竟半夜偷溜回办公室写代码?一个为自由软件而战斗的程序员
  2. java 解析注解_Java知识点总结(注解-解析注解)
  3. 一万的阶乘c语言方法,求10000的阶乘(c语言代码实现)
  4. SpringCloud教程-分布式配置中心Config (SpringCloud版本Greenwich.SR4)
  5. .NET6之MiniAPI(二十七):Metrics
  6. 深度学习为图片人物换装【python代码教程】
  7. flutter GridView 九宫格
  8. Logistic回归分类算法原理分析与代码实现
  9. oracle 19c ora-01017,Oracle 19c RMAN 连接PDB ORA-01017 错误解决方法
  10. 计算机类研究生求职经历以及经验共享(转)
  11. 分析 AlphaGo 算法原理的本质
  12. 液压传动与控制QY-QDSY16
  13. 让Google搜索到GitHub上的个人博客
  14. 如何把网吧计算机放到桌面,网吧电脑怎么切换游戏桌面
  15. 【冬瓜哥手绘】致敬龙芯!冬瓜哥手工设计了一个CPU译码器!
  16. 使用python建立n维0矩阵
  17. 当你在进行SDK安装更新时,遇到了一些不能安装的项目时,你可以酱紫····
  18. 关于hadoop运行成功但是无法链接web页面
  19. HTML中利用JS调用PHP (以登录为例)
  20. 成功解决需要Xmanager软件来处理X11转发需求

热门文章

  1. CentOS系统安装桌面
  2. IE6 式样表 Bug
  3. BS程序代码与安全与基本攻击/防御模式
  4. LED适用范围及寿命
  5. vim常用替换表达式
  6. python匹配中文
  7. 创建和准备Oracle样例数据库
  8. 图解notepad++插件使用
  9. 图解使用CygWin进行Linux操作和编程
  10. 小程序里的自定义组件:组件的外部样式externalClasses的使用