CF993E Nikita and Order Statistics

IX.CF993E Nikita and Order Statistics

首先,一上来就能想到的思路,对于<x的位置,赋成1;对于x的位置,赋成0,然后跑前缀和,设为sumx。这样子,x在某个子串[l,r]中的排名就是sumrsuml1

xsum数组中出现了cntx次。则某个k的答案ansk=i=kncnticntik。因为挑选任何一个sum=i的前缀与任何一个sum=ik的前缀,都可以拼成一个k出来。

遇事不决就翻转。我们设f表示原本的cntg表示翻转(gx=cntnx)后的cnt

则现在,ansnk=i+j=kfigj。是卷积的形式,直接FFT!!!

不过有几个注意点:

1.sum0,即空前缀和,也要计入cnt,不然类似于串[1,r]的就不会被计入。估计只有我一个人才会忘记吧

2.ans0要特判,因为某些串你瞎卷卷可能卷出来长度为0的串。可以直接O(n)暴力扫一遍即可。

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const double pi=acos(-1);
int n,m,cnt[1<<20],lg,lim=1,h[1<<20],rev[1<<20],sum[1<<20];
struct cp{
	double x,y;
	cp(double u=0,double v=0){x=u,y=v;}
	friend cp operator +(const cp &u,const cp &v){return cp(u.x+v.x,u.y+v.y);}
	friend cp operator -(const cp &u,const cp &v){return cp(u.x-v.x,u.y-v.y);}
	friend cp operator *(const cp &u,const cp &v){return cp(u.x*v.x-u.y*v.y,u.x*v.y+u.y*v.x);}
}f[1<<20],g[1<<20];
void FFT(cp *a,int tp){
	for(int i=0;i<lim;i++)if(i<rev[i])swap(a[i],a[rev[i]]);
	for(int md=1;md<lim;md<<=1){
		cp rt=cp(cos(pi/md),tp*sin(pi/md));
		for(int stp=md<<1,pos=0;pos<lim;pos+=stp){
			cp w=cp(1,0);
			for(int i=0;i<md;i++,w=w*rt){
				cp x=a[pos+i],y=w*a[pos+md+i];
				a[pos+i]=x+y;
				a[pos+md+i]=x-y;
			}
		}
	}
}
int zero(){
	int pos=0,res=0;
	for(int i=1;i<=n;i++){
		if(sum[i]!=sum[i-1])pos=i;
		res+=i-pos;
	}
	return res;
}
signed main(){
	scanf("%lld%lld",&n,&m);
	while(lim<=n*2+1)lim<<=1,lg++;
	for(int i=0;i<lim;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(lg-1));
	cnt[0]++;
	for(int i=1,x;i<=n;i++)scanf("%lld",&x),sum[i]=sum[i-1]+(x<m),cnt[sum[i]]++;
	for(int i=0;i<=n;i++)f[i]=cp(cnt[i],0),g[i]=cp(cnt[n-i],0);
	FFT(f,1),FFT(g,1);
	for(int i=0;i<lim;i++)f[i]=f[i]*g[i];
	FFT(f,-1);
	for(int i=0;i<=n;i++)h[n-i]=(int)(f[i].x/lim+0.5);
	printf("%lld ",zero());
	for(int i=1;i<=n;i++)printf("%lld ",h[i]);
	return 0;
}
posted @   Troverld  阅读(141)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示