CF993E Nikita and Order Statistics

CF993E Nikita and Order Statistics

题意:

给你一个数组 a1∼na_{1 \sim n}a1n,对于 k=0∼nk = 0 \sim nk=0n,求出有多少个数组上的区间满足:区间内恰好有 k 个数比 x 小。 x 为一个给定的数。
n≤2×105n \le 2 \times 10^5n2×105
−1e9<=ai<=1e9-1e9<=a_i<=1e91e9<=ai<=1e9

题解:

因为x是常数,也就是说对于每个数只有贡献和无贡献之分
所以我们把所有大于等于X的数都改为0,小于X的数都改为1,这样原问题就转化为问有多少个连续序列满足和为k
用公式表示就是:∑i=1n∑j=1n[ai−aj=k]\sum_{i=1}^n\sum_{j=1}^n[a_i-a_j=k]i=1nj=1n[aiaj=k]
设前缀和sumi=∑j=1iajsum_i=\sum_{j=1}^ia_jsumi=j=1iaj
再设Si=∑[sumj=i],S0=0S_i=\sum[sum_j=i],S_0=0Si=[sumj=i],S0=0,SiS_iSi就表示前缀和等于i的数量
原问题就变成求:∑i=k+1nSi⋅Si−k\sum_{i=k+1}^nS_i⋅S_{i-k}i=k+1nSiSik
比如k=2时,我们要查询区间和等于2的数量,答案就是区间前缀和等于3的数量乘以区间和等于1的数量,前缀和等于4的数量乘以前缀和等于2的数量…。因为前缀和等于3的减去前缀和等于1得到的这段区间一定是等于2的,因此可以这样转化
这个式子看着愈发熟悉。。好像是卷积,卷起来
∑i=k+1nSi⋅Si−k=∑i−j=kSi⋅Sj=∑i+j=kSi⋅S−j=∑i+j=n+kSi⋅Sn−j\sum_{i=k+1}^nS_i⋅S_{i-k}=\sum_{i-j=k}S_i⋅S_{j}=\sum_{i+j=k}S_i⋅S_{-j}=\sum_{i+j=n+k}S_i⋅S_{n-j}i=k+1nSiSik=ij=kSiSj=i+j=kSiSj=i+j=n+kSiSnj
答案就是n+k的系数,k=0时要特判

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double PI=acos(-1.0);
struct Complex{double x,y;Complex(double _x=0.0,double _y=0.0){x=_x;y=_y;}Complex operator -(const Complex &b)const{return Complex(x-b.x,y-b.y);}Complex operator +(const Complex &b)const{return Complex(x+b.x,y+b.y);}Complex operator *(const Complex &b)const{return Complex(x*b.x-y*b.y,x*b.y+y*b.x);}
};
void change(Complex y[],int len)
{int i,j,k;for(i=1,j=len/2;i<len-1;i++){if(i<j) swap(y[i],y[j]);k=len/2;while(j>=k){j-=k;k/=2;}if(j<k)j+=k;}
}
void fft(Complex y[],int len,int on)
{change(y,len);for(int h=2;h<=len;h<<=1){Complex wn(cos(-on*2*PI/h),sin(-on*2*PI/h));for(int j=0;j<len;j+=h){Complex w(1,0);for(int k=j;k<j+h/2;k++){Complex u=y[k];Complex t=w*y[k+h/2];y[k]=u+t;y[k+h/2]=u-t;w=w*wn;}}}if(on==-1)for(int i=0;i<len;i++)y[i].x/=len;
}
const int MAXN=800010;
Complex x1[MAXN],x2[MAXN];
int str1[MAXN/2],str2[MAXN/2],a[MAXN];
ll sum[MAXN];
int _sum[MAXN];
int t,n,x;
int main()
{scanf("%d%d",&n,&x);memset(str1,0,sizeof str1);memset(str2,0,sizeof str2);str1[0]=1;for(int i=1;i<=n;i++){scanf("%d",&a[i]);if(a[i]<x)a[i]=1;else a[i]=0;_sum[i]=_sum[i-1]+a[i];str1[_sum[i]]+=1;}for(int i=0;i<=n;i++){str2[i]=str1[n-i];}int len=1,len1=n+1,len2=n+1;while(len<len1*2||len<len2*2) len<<=1;for(int i=0;i<len1;i++)x1[i]=Complex(str1[i],0);for(int i=len1;i<len;i++)x1[i]=Complex(0,0);for(int i=0;i<len2;i++)x2[i]=Complex(str2[i],0);for(int i=len2;i<len;i++)x2[i]=Complex(0,0);
//    for(int i=0;i<len;i++){
//    	cout<<x2[i].x<<" "; 
//	} 
//	cout<<endl;
//	cout<<"--"<<endl;
//	for(int i=0;i<len;i++){
//    	cout<<str2[i]<<" "; 
//	} cout<<endl;fft(x1,len,1);fft(x2,len,1);for(int i=0;i<len;i++)x1[i]=x1[i]*x2[i];
//    for(int i=0;i<len;i++)
//        cout<<"x1[i]="<<x1[i].x<<endl;
//    cout<<endl;fft(x1,len,-1);ll ans=0,num=0;for(int i=1;i<=n+1;i++){if(a[i]==0&&i!=n+1)num++;else {ans+=num*(num+1)/2;num=0; } }cout<<ans<<" ";//	cout<<endl;for(int i=1;i<=n;i++){cout<<(ll)(x1[i+n].x+0.5)<<" ";}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core 通过 Microsoft.DotNet.Watcher.Tools 实现热部署

之前开发前端的时候&#xff0c;webpack 会有热更新工具&#xff0c;在修改了代码之后&#xff0c;自动将代码编译&#xff0c;实时展现到页面上&#xff0c;给开发带来了极大的方便。Java也可以通过第三方插件JRebel实现热部署&#xff0c;不用频繁的重启Tomcat。微软官方也为…

P3825 [NOI2017]游戏

P3825 [NOI2017]游戏 题目描述 小 L 计划进行n场游戏&#xff0c;每场游戏使用一张地图&#xff0c;小 L 会选择一辆车在该地图上完成游戏。 小 L 的赛车有三辆&#xff0c;分别用大写字母A、B、C表示。地图一共有四种&#xff0c;分别用小写字母x、a、b、c表示。其中&#x…

事关SuperSocket发布,寻找YangFan哥哥

SuperSocket近日发布了2.0的第一个预览版《SuperSocket 2.0 Preview1 发布&#xff0c;.NET Socket服务器框架》&#xff0c;在NuGet上以一个包含数个SuperSocket程序集的大包的形式发布。https://www.nuget.org/packages/SuperSocket/2.0.0-preview1我原意以独立小包的形式发布…

P3321 [SDOI2015]序列统计(未解决)

P3321 [SDOI2015]序列统计 题意&#xff1a; 题解&#xff1a; 参考题解&#xff1a; 题解 P3321 【[SDOI2015]序列统计】 【LG3321】[SDOI2015]序列统计 神仙题。。学透再补 代码&#xff1a;

P1963 [NOI2009]变换序列

题目描述 不想水字&#xff0c;详见某谷&#xff1a;P1963 [NOI2009]变换序列 solution 其实 的计算就类似于环上的距离。 对于每一个 都可能有两种位置选择&#xff1a;&#xff0c; 。 所以把它们分别连边&#xff0c;二分图上匈牙利算法求完美匹配即可。 #include&…

一次 .NET Core 中玩锁的经历:ManualResetEventSlim, SemaphoreSlim

最近同事对 .net core memcached 缓存客户端 EnyimMemcachedCore 进行了高并发下的压力测试&#xff0c;发现在 linux 上高并发下使用 async 异步方法读取缓存数据会出现大量失败的情况&#xff0c;比如在一次测试中&#xff0c;100万次读取缓存&#xff0c;只有12次成功&…

BZOJ4589. Hard Nim

BZOJ4589. Hard Nim 题意&#xff1a; Claris和NanoApe在玩石子游戏&#xff0c;他们有n堆石子&#xff0c;规则如下&#xff1a; Claris和NanoApe两个人轮流拿石子&#xff0c;Claris先拿。每次只能从一堆中取若干个&#xff0c;可将一堆全取走&#xff0c;但不可不取&…

P2825 [HEOI2016/TJOI2016]游戏

题目描述 详见 P2825 [HEOI2016/TJOI2016]游戏。 solution 套路题。 一般思路是行列建点跑二分图最大匹配。 此题中的#会分隔行列&#xff0c;因此我们把每行的极大联通块设为点&#xff0c;列同理建点。 再对于每个*对应的行的极大联通块与列的最大联通块编号连边&…

P3033 [USACO11NOV]牛的障碍Cow Steeplechase

P3033 [USACO11NOV]牛的障碍Cow Steeplechase 题目描述 详见&#xff1a;P3033 [USACO11NOV]牛的障碍Cow Steeplechase solution 裸题。 对于每一对相交的线段&#xff0c;连一条边&#xff0c;表示这一对线段不能都取。 显然这样会建立一个二分图&#xff08;横的线段不…

Tree Cutting HDU - 5909

Tree Cutting HDU - 5909 题意&#xff1a; 一个无根树&#xff0c;n个点&#xff0c;n-1条边&#xff0c;每个节点有一个权值&#xff0c;一棵树的权值就是其节点(包含本身及其子节点)的权值的异或和&#xff1b;求价值为[0,m)的树有多少颗&#xff1f;(所谓的树其实就是原连…

Redis作者antirez:开源维护者的挣扎

这两天&#xff0c;一篇名为《开源维护者的挣扎》的文章被迅速顶至 Hacker News 首页&#xff0c;这是 Redis 作者 antirez 发布的最新博客。几个月前&#xff0c;一名开源项目的维护者向 antirez 发邮件&#xff0c;倾诉自己苦心维护项目多年&#xff0c;这或多或少带来了一些…

CF662C Binary Table

CF662C Binary Table 题意&#xff1a; 有一个 n 行 m 列的表格&#xff0c;每个元素都是 0/1 &#xff0c;每次操作可以选择一行或一列&#xff0c;把 0/1 翻转&#xff0c;即把 0 换为 1 &#xff0c;把 1 换为 0 。请问经过若干次操作后&#xff0c;表格中最少有多少个 1 …

P4111 [HEOI2015]小Z的房间

P4111 [HEOI2015]小Z的房间 题目描述 详见&#xff1a;P4111 [HEOI2015]小Z的房间 solution Matrix-Tree裸题。 题意为求一个有障碍的网格图的生成树个数。 因此对于每一个点向左边和上面的节点连边&#xff0c;Matrix-Tree定理求解生成树个数即可。 #include<bits/s…

黑科技抢先尝(续) - Windows terminal中WSL Linux 终端的极简美化指南

之前&#xff0c;本人写了两篇文章 黑科技抢先尝 | Windows全新终端初体验(附代码Build全过程) 和 程会玩 | 无需自行编译也能玩转 Windows Terminal&#xff0c;介绍了玩转Windows terminal的两种方式。今天这篇文章&#xff0c;主要介绍如何美化 Windows terminal 中 WSL 的 …

P3203 [HNOI2010]弹飞绵羊

P3203 [HNOI2010]弹飞绵羊 题目描述 详见&#xff1a;P3203 [HNOI2010]弹飞绵羊 solution 这是一道LCT的裸题。 但是我并不想用LCT解决此题&#xff08;In fact 是不会LCT ~QAQ&#xff09; 于是我们开始大力分块。 考虑把弹跳装置分块&#xff0c;我们每次需要知道在一…

L - Two Ants Gym - 102823L

L - Two Ants Gym - 102823L 题意&#xff1a; 有两个线段A&#xff0c;B&#xff0c;两个线段不会超过一个公共点&#xff0c; 你站在线段B上&#xff0c;整个平面你看不到的区域的面积(如图中S所在区域) 题解&#xff1a; 计算几何&#xff0c;恶心题。调了一个小时还是…

C# 8.0 中开启默认接口实现

当你升级到 C# 8.0 和 .NET Core 3.0 之后&#xff0c;你就可以开始使用默认接口实现的功能了。从现在开始&#xff0c;你可以在接口里面添加一些默认实现的成员&#xff0c;避免在接口中添加成员导致大量对此接口的实现崩溃。要写出并且正常使用接口的默认实现&#xff0c;你需…

P4396 [AHOI2013]作业

P4396 [AHOI2013]作业 题目描述 详见&#xff1a;P4396 [AHOI2013]作业 solution 莫队树状数组的裸题&#xff08;莫队分块&#xff0c;CDQ分治都可以&#xff0c;莫队线段树大概需要卡常&#xff09;。 时间复杂度 Code #include<bits/stdc.h> using namespac…

Codeforces Round #732 (Div. 1Div. 2)

Codeforces Round #732 (Div. 2) 题号题目知识点AAquaMoon and Two Arrays贪心BAquaMoon and Stolen String异或CAquaMoon and Strange SortDAquaMoon and ChessEAquaMoon and PermutationsFAquaMoon and Wrong CoordinateG1AquaMoon and Time Stop (easy version)G2AquaMoon …

在编写异步方法时,使用 ConfigureAwait(false) 避免使用者死锁

我在 使用 Task.Wait()&#xff1f;立刻死锁&#xff08;deadlock&#xff09; 一文中站在类库使用者的角度看 async/await 代码的死锁问题&#xff1b;而本文将站在类库设计者的角度来看死锁问题。阅读本文&#xff0c;我们将知道如何编写类库代码&#xff0c;来尽可能避免类库…