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的时候递归到小于最大值但大于次大值修改,这个就是最重要的 ...
随机推荐
- 第一阶段·Linux运维基础 第3章·文件属性、正则表达式、文件权限
01-文件属性内容介绍 02- inodeyublock讲解 03-访问oldboyfile的寻宝过程 04-inode与block小结 05-磁盘空间不足案例详解 06-Linux文件类型及拓展名 ...
- Linux命令大全(非常全,史上最全)
最近学习Linux,最大的体验就是它的很多东西都需要由命令来进行控制,下面是我总结的一些命令,供大家参考: 系统信息 arch 显示机器的处理器架构 uname -m 显示机器的处理器架构 una ...
- Unity Android设备的输入
Unity Android设备的输入 1依据屏幕位置输入 有的时候也许是为了整个有些风格的干净,减少屏幕上的UI图标,以至于摒弃了虚拟按键这种常用的输入方式.为了替代虚拟按键的输入方式而选择了依据点击 ...
- POJ - 3259
要判断是否有负的权值 #include<iostream> #include<stdio.h> #include<algorithm> #include<st ...
- Cassandra 类型转换限制
原文地址:http://stackoverflow.com/questions/31880381/cassandra-alter-column-type-which-types-are-compati ...
- Python3 Tkinter-PaneWindow
1.向PanedWindow中添加Pane from tkinter import * root=Tk() panes=PanedWindow(orient=VERTICAL) panes.pack( ...
- StreamSets小白踩过的一些坑
由于公司业务上的需求,需要实时监控mysql数据库的数据的增长,并将数据同步到另一个平台,所以就问老大使用什么工具比较好,老大推荐使用StreamSets,还说在测试环境都已经部署好了StreamSe ...
- 【树莓派 Raspberry-Pi 】用Windows远程桌面连接树莓派的方法【转】
树莓派DIY笔记之前有介绍过用VNC连接到树莓派的方法.在Windows下,当然还是自带的远程桌面更便捷.如果不想用VNC,利用远程桌面(mstsc.exe)连接树莓派,如何实现? 只需要在raspb ...
- python学习摘要(2)--基本数据类型
python申请存储空间是动态的.变量如同指针一样指向存储空间.多个变量会指向同一个存储空间(节省空间).当变量改变时,原来的地址单元并不会马上释放.(引用计数自行回收) c/c++根基性语言,想要什 ...
- python学习笔记07:自定义类型
class person: def __init__(self,name,age,weight): self.name = name self.age = age self.weight = weig ...