CF993E:Nikita and Order Statistics(FFT)
Description
Input
第二行给出$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)的更多相关文章
- CF993E Nikita and Order Statistics 【fft】
题目链接 CF993E 题解 我们记小于\(x\)的位置为\(1\),否则为\(0\) 区间由端点决定,转为两点前缀和相减 我们统计出每一种前缀和个数,记为\(A[i]\)表示值为\(i\)的位置出现 ...
- Codeforces 993E Nikita and Order Statistics [FFT]
洛谷 Codeforces 思路 一开始想偏想到了DP,后来发现我SB了-- 考虑每个\(a_i<x\)的\(i\),记录它前一个和后一个到它的距离为\(L_i,R_i\),那么就有 \[ an ...
- CF993E Nikita and Order Statistics
小于x的赋值为1,否则为0 区间等于k的个数 求0~n连续的n+1个k? N<=1e5? FFT! 考虑卷积建模:用下标相加实现转移到位,数值相乘类比乘法原理! 法一: 分治,然后FFT没了 法 ...
- CF993E Nikita and Order Statistics 多项式卷积 快速傅里叶变换
题意: 给你一个数组a1~an,对于k=0~n,求出有多少个数组上的区间满足:区间内恰好有k个数比x小.x为一个给定的数.n<=10^5.值域没有意义. 分析: 大神们都说这道题是一个套路题,真 ...
- [Codeforces 993E]Nikita and Order Statistics
Description 题库链接 给你一个长度为 \(n\) 的序列 \(A\) ,和一个数 \(x\) ,对于每个 \(i= 0\sim n\) ,求有多少个非空子区间满足恰好有 \(i\) 个数 ...
- CLRS:median and order statistics
//maximum and minimum 暴力遍历 O(n) //i-th element dicide and conquer random_selected_partition ...
- 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 < ...
- cf22A Second Order Statistics(STL-UNIQUE的使用)
题意: N个数,找出第二大的数.如果没有输出-1. 思路: UNIQUE的使用. 代码: int a[105]; int n; int main(){ cin>>n; rep(i,0,n- ...
- FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅰ
众所周知,tzc 在 2019 年(12 月 31 日)就第一次开始接触多项式相关算法,可到 2021 年(1 月 1 日)才开始写这篇 blog. 感觉自己开了个大坑( 多项式 多项式乘法 好吧这个 ...
随机推荐
- jquery select change下拉框选项变化判断选中值
<th class="formTitle"> 是否转出: </th> <td class="formValue" colspan= ...
- 撩课-Web大前端每天5道面试题-Day17
1.apply, call和bind有什么区别? 三者都可以把一个函数应用到其他对象上,注意不是自身对象. apply,call是直接执行函数调用,bind是绑定,执行需要再次调用. apply和ca ...
- jeecg框架解决跨域问题
controller层方法体中添加如下代码 response.setHeader("Access-Control-Allow-Origin", "*");res ...
- MQ与Webservice的区别
Webservice 和MQ(MessageQueue)都是解决跨平台通信的常用手段,两者有哪些区别呢? 个人认为最本质的区别在于 Webservice近乎实时通信,而MQ却通常是延时通信. 什么意思 ...
- XML序列化与REST WCF Data Contract匹配时遇到的2个问题
问题一: XML序列化与RESTful WCF Data Contract不能匹配,无法传递类的值. 现象: 给类加上[Serializable]Attribute,可以成功序列化,但是WCF Ser ...
- BZOJ4144: [AMPPZ2014]Petrol(最短路 最小生成树)
题意 题目链接 Sol 做的时候忘记写题解了 可以参考这位大爷 #include<bits/stdc++.h> #define Pair pair<int, int> #def ...
- Google JavaScript样式指南
Google JavaScript样式指南 目录 1简介 1.1术语说明 1.2指南说明 2源文件基础知识 2.1文件名 2.2文件编码:UTF-8 2.3特殊字符 3源文件结构 3.1许可或版权 ...
- Debian 8 升级到 9 Debian 9 How to upgrade Debian 8 Jessie to Debian 9 Stretch
How to upgrade Debian 8 Jessie to Debian 9 Stretch Contents 1. Objective 2. What's New 3. Preparatio ...
- php数组指针
数组指针的操作: 移动数组指针的操作: Next() 向下 同时会获得当前元素的值. Prev() 向上同时会获得当前元素的值. End() 移动到最后一个元素单元 获得最后一个元素的值 Reset( ...
- clipChildren属性
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...