CF993E Nikita and Order Statistics
小于x的赋值为1,否则为0
区间等于k的个数
求0~n连续的n+1个k?
N<=1e5?
FFT!
考虑卷积建模:用下标相加实现转移到位,数值相乘类比乘法原理!
法一:
分治,然后FFT没了
法二:
不分治也可以!区间查询->前缀相减
ans[j-i]=f[j]*f[i],f[i]表示数值为i的前缀和个数
减法怎么办?
reverse变成加法!
i->n-i
ans[j-i]=f[j]*f[i]=f[j]*f'[n-i]
FFT一下,n+j-i位置的值就是ans辣
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define numb (ch^'0')
using namespace std;
typedef long long ll;
il void rd(int &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
namespace Miracle{
const double Pi=acos(-);
const int N=2e5+;
struct po{
double x,y;
po(){}
po(double xx,double yy){
x=xx;y=yy;
}
po friend operator +(po a,po b){
return po(a.x+b.x,a.y+b.y);
}
po friend operator -(po a,po b){
return po(a.x-b.x,a.y-b.y);
}
po friend operator *(po a,po b){
return po(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
}
}a[*N],b[*N];
int c[N],s[N];
int n,x;
int rev[*N];
ll ans[N];
void fft(po *f,int c){
for(reg i=;i<n;++i){
if(i<rev[i]) swap(f[i],f[rev[i]]);
}
for(reg p=;p<=n;p<<=){
po gen;int len=p/;
gen=po(cos(Pi/len),c*sin(Pi/len));
for(reg l=;l<n;l+=p){
po buf=po(1.0,0.0);
for(reg k=l;k<l+len;++k){
po tmp=f[k+len]*buf;
f[k+len]=f[k]-tmp;
f[k]=f[k]+tmp;
buf=buf*gen;
}
}
}
}
int main(){
rd(n);rd(x);
int lp=n;
for(reg i=;i<=n;++i) {
rd(c[i]);c[i]=c[i]<x;
s[i]=s[i-]+c[i];
++a[s[i]].x;
}
++a[s[]].x;
for(reg i=;i<=n;++i){
b[i].x=a[n-i].x;
}
int m;
for(m=*n,n=;n<=m;n<<=);
for(reg i=;i<n;++i){
rev[i]=(rev[i>>]>>)|((i&)?(n>>):);
}
// for(reg i=1;i<=lp;++i){
// cout<<c[i]<<" ";
// }cout<<endl;
// for(reg i=0;i<n;++i){
// cout<<a[i].x<<" ";
// }cout<<endl;
// for(reg j=0;j<n;++j){
// cout<<b[j].x<<" ";
// }cout<<endl;
fft(a,);
fft(b,);
for(reg i=;i<n;++i) b[i]=a[i]*b[i];
fft(b,-);
for(reg i=;i<=lp;++i) ans[i]=round(b[lp-i].x/n);
//cout<<" ans[0] "<<ans[0]<<endl;
ans[]=(ans[]+(lp+))/-(lp+);
for(reg i=;i<=lp;++i){
printf("%lld ",ans[i]);
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2018/12/27 9:01:58
*/
reverse想法比较有意思!
值得注意!
CF993E Nikita and Order Statistics的更多相关文章
- CF993E Nikita and Order Statistics 【fft】
题目链接 CF993E 题解 我们记小于\(x\)的位置为\(1\),否则为\(0\) 区间由端点决定,转为两点前缀和相减 我们统计出每一种前缀和个数,记为\(A[i]\)表示值为\(i\)的位置出现 ...
- CF993E:Nikita and Order Statistics(FFT)
Description 给你一个数组 $a_{1 \sim n}$,对于 $k = 0 \sim n$,求出有多少个数组上的区间满足:区间内恰好有 $k$ 个数比 $x$ 小.$x$ 为一个给定的数. ...
- CF993E Nikita and Order Statistics 多项式卷积 快速傅里叶变换
题意: 给你一个数组a1~an,对于k=0~n,求出有多少个数组上的区间满足:区间内恰好有k个数比x小.x为一个给定的数.n<=10^5.值域没有意义. 分析: 大神们都说这道题是一个套路题,真 ...
- Codeforces 993E Nikita and Order Statistics [FFT]
洛谷 Codeforces 思路 一开始想偏想到了DP,后来发现我SB了-- 考虑每个\(a_i<x\)的\(i\),记录它前一个和后一个到它的距离为\(L_i,R_i\),那么就有 \[ an ...
- [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- ...
- NOIWC前的交流题目汇总
RT 2018.12.27 i207M:BZOJ 4695 最假女选手 以维护最大值为例,记录最大值和严格次大值和最大值的出现次数,然后取min的时候递归到小于最大值但大于次大值修改,这个就是最重要的 ...
随机推荐
- MySQL☞lower函数
lower(列名/字符串):将大写字母改成小写字母 格式: select lower(列名/字符串) from 表名 如下图:
- mapReduce入门教程
什么是MapReduce MapReduce是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Reduce(归纳)&q ...
- POJ 2229 计数DP
dp[i]代表是数字i的最多组合数如果i是一个奇数,i的任意一个组合都包含1,所以dp[i] = dp[i-1] 如果i是一个偶数,分两种情况讨论,一种是序列中包含1,因此dp[i]=dp[i-1]一 ...
- [离散化]人潮最多的時段( Interval Partitioning Problem )
範例:人潮最多的時段( Interval Partitioning Problem ) 一群訪客參加宴會,我們詢問到每一位訪客的進場時刻與出場時刻,請問宴會現場擠進最多人的時段. 換個角度想,想像會場 ...
- lintcode-14-二分查找
二分查找 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. 样例 在数组 ...
- iOS开发GCD的简单使用
- (void)viewDidLoad { [super viewDidLoad]; // gcd 可以充分调用设备的 cpu 发挥最大性能,在 C 语言基础之上封装的 // dispatch_que ...
- 【Linux】- netstat 命令
Linux netstat命令用于显示网络状态.利用netstat指令可让你得知整个Linux系统的网络情况. 语法 netstat [-acCeFghilMnNoprstuvVwx][-A<网 ...
- C# 使用this的形参
示例1: public static RectangleF TransformRect(this Matrix mat, RectangleF rect) 是向Matrix类扩展带有Rectangle ...
- [OS] 操作系统错题集
1. (判断) 答案:错 缓冲区有两块:高速缓存区(物理存在)和磁盘缓存区(逻辑存在,实际是内存一块),都不在外存(硬盘). 2. 操作系统的功能:处理机管理(进程管理).作业管理.存储管理.设备管理 ...
- overflow:scroll 在ios 滚动卡顿
使用 -webkit-overflow-scrolling 属性控制元素在移动设备上是否使用滚动回弹效果. 值 auto 使用普通滚动, 当手指从触摸屏上移开,滚动会立即停止. touch 使用具有回 ...