[Codeforces 993E]Nikita and Order Statistics
Description
给你一个长度为 \(n\) 的序列 \(A\) ,和一个数 \(x\) ,对于每个 \(i= 0\sim n\) ,求有多少个非空子区间满足恰好有 \(i\) 个数 \(<x\) 。
\(1 \leq n \leq 2 \cdot 10^5\)
Solution
我们用 \([A_i<x]\) 做一个前缀和,显然这是单调递增的。记前缀和为 \(i\) 的个数为 \(f_i\) 。
显然对于 \(i=k,k\neq 0\) 答案就是
\[\sum_{i=0}^{n-k}f(i+k)f(i)\]
我们令 \(g(i)=f(n-i)\) ,那么答案就是
\[\sum_{i=0}^{n}f(i+k)g(n-i)\]
卷一下就好了,不过注意到是非空子集,所以对于 \(k=0\) 时要特判。
Code
#include <bits/stdc++.h>
#define ll long long
#define dob complex<double>
using namespace std;
const double pi = acos(-1.0);
const int N = (200000<<2)+5;
int n, m, x, sum[N], u, R[N], L, len, cnt[N];
dob a[N], b[N];
void FFT(dob *A, int o) {
for (int i = 0; i < len; i++) if (i < R[i]) swap(A[i], A[R[i]]);
for (int i = 1; i < len; i <<= 1) {
dob wn(cos(pi/i), sin(pi*o/i)), x, y;
for (int j = 0; j < len; j += (i<<1)) {
dob w(1, 0);
for (int k = 0; k < i; k++, w *= wn) {
x = A[j+k], y = w*A[j+k+i];
A[j+k] = x+y, A[j+k+i] = x-y;
}
}
}
}
void work() {
scanf("%d%d", &n, &x); cnt[0]++;
for (int i = 1; i <= n; i++) {
scanf("%d", &u), sum[i] = sum[i-1]+(u < x);
cnt[sum[i]]++;
}
for (int i = 0; i <= n; i++) a[i] = cnt[i];
for (int i = 0; i <= n; i++) b[i] = cnt[n-i];
m = (n<<1);
for (len = 1; len <= m; len <<= 1) ++L;
for (int i = 0; i < len; i++) R[i] = (R[i>>1]>>1|((i&1)<<(L-1)));
FFT(a, 1), FFT(b, 1);
for (int i = 0; i < len; i++) a[i] = a[i]*b[i];
FFT(a, -1);
printf("%I64d", (ll)(a[n].real()/len+0.5-n)>>1);
for (int i = 1; i <= n; i++) printf(" %I64d" , (ll)(a[i+n].real()/len+0.5));
}
int main() {work(); return 0; }
[Codeforces 993E]Nikita and Order Statistics的更多相关文章
- Codeforces 993E Nikita and Order Statistics [FFT]
洛谷 Codeforces 思路 一开始想偏想到了DP,后来发现我SB了-- 考虑每个\(a_i<x\)的\(i\),记录它前一个和后一个到它的距离为\(L_i,R_i\),那么就有 \[ an ...
- CF993E:Nikita and Order Statistics(FFT)
Description 给你一个数组 $a_{1 \sim n}$,对于 $k = 0 \sim n$,求出有多少个数组上的区间满足:区间内恰好有 $k$ 个数比 $x$ 小.$x$ 为一个给定的数. ...
- CF993E Nikita and Order Statistics 【fft】
题目链接 CF993E 题解 我们记小于\(x\)的位置为\(1\),否则为\(0\) 区间由端点决定,转为两点前缀和相减 我们统计出每一种前缀和个数,记为\(A[i]\)表示值为\(i\)的位置出现 ...
- 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 756C Nikita and stack
Codeforces 756C Nikita and stack 题目大意: 给定一个对栈进行操作的操作序列,初始时序列上没有任何操作,每一次将一个本来没有操作的位置变为某一操作(push(x),po ...
- codeforces 637B B. Chat Order(map,水题)
题目链接: B. Chat Order time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- CLRS:median and order statistics
//maximum and minimum 暴力遍历 O(n) //i-th element dicide and conquer random_selected_partition ...
- codeforces 8C. Looking for Order 状压dp
题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...
随机推荐
- ASP.Net Core 2.2 MVC入门到基本使用系列 (一)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...
- NET 下载共享文件
执行 public static void Run() { "); if (state) { // 共享文件夹的目录 TransportRemoteToLocal(@"\\192. ...
- 879. Profitable Schemes
There are G people in a gang, and a list of various crimes they could commit. The i-th crime generat ...
- Queue-621. Task Scheduler
Given a char array representing tasks CPU need to do. It contains capital letters A to Z where diffe ...
- Recursion-687. Longest Univalue Path
Given a binary tree, find the length of the longest path where each node in the path has the same va ...
- Android应用安全防护和逆向分析 ——apk反编译
概述 最近一直在学习Android应用安全相关和逆向分析的知识.现在移动app在安全方面是越来越重视了,特别是那些巨头企业涉及到钱的应用,那加密程度,简直是丧心病狂,密密麻麻.从这里可以看出,对于应用 ...
- Oracle 数据类型 与C#映射关系
大部分类型的对应关系:原文:http://2143892.blog.51cto.com/2133892/499353 序号 Oracle数据类型 .NET类型 GetOracleValue类型 DbT ...
- dataTable 参数说明
下面是一些常用的参数列表,比较常用或者有价值的标示为绿色. 功能参数(Features) 参数名 说明 参考值 默认值 autoWidth 定义是否由控件自动控制列宽 Boolean true def ...
- JS:函数柯里化
函数柯里化 柯里化 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术. 简单来说,就 ...
- Ubuntu16.04 Nvidia驱动、CUDA安装
安装Nvidia驱动和CUDA时往往很费力,经常有莫名奇妙的错误,这次安装十分顺畅,权当记录一下,以方便以后再次安装. 一.Nvidia显卡驱动安装 sudo add-apt-repository p ...