BZOJ2769 : YY的快速排序
将数字离散化并去重,则对于一对逆序对$i<j$,$a_i>a_j$,贡献为$\frac{2}{a_i-a_j+1}$,因此只要对于每个差值统计出对应的逆序对个数即可。
将序列分块,块内平方暴力,块与块之间做FFT即可。
时间复杂度$O(n\sqrt{n\log n})$。
- #include<cstdio>
- #include<algorithm>
- #include<cmath>
- using namespace std;
- const int N=33000;
- int n,m,x,i,j,k,pos[N],a[N],b[N],at[N],st[N],en[N],f[N];double ans;
- struct comp{
- double r,i;comp(double _r=0,double _i=0){r=_r;i=_i;}
- comp operator+(const comp&x){return comp(r+x.r,i+x.i);}
- comp operator-(const comp&x){return comp(r-x.r,i-x.i);}
- comp operator*(const comp&x){return comp(r*x.r-i*x.i,r*x.i+i*x.r);}
- comp conj(){return comp(r,-i);}
- }A[N],B[N];
- const double pi=acos(-1.0);
- void FFT(comp a[],int n,int t){
- for(int i=1;i<n;i++)if(i<pos[i])swap(a[i],a[pos[i]]);
- for(int d=0;(1<<d)<n;d++){
- int m=1<<d,m2=m<<1;
- double o=pi*2/m2*t;comp _w(cos(o),sin(o));
- for(int i=0;i<n;i+=m2){
- comp w(1,0);
- for(int j=0;j<m;j++){
- comp&A=a[i+j+m],&B=a[i+j],t=w*A;
- A=B-t;B=B+t;w=w*_w;
- }
- }
- }
- if(t==-1)for(int i=0;i<n;i++)a[i].r/=n;
- }
- inline int lower(int x){
- int l=1,r=m,mid,t;
- while(l<=r)if(b[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
- return t;
- }
- int main(){
- scanf("%d",&n);
- for(i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];
- sort(b+1,b+n+1);
- for(i=1;i<=n;i++)if(i==1||b[i]!=b[i-1])b[++m]=b[i];
- for(i=1;i<=n;i++)a[i]=lower(a[i]);
- for(i=1;i<=n;i++)at[i]=(i-1)/1500+1;
- for(i=1;i<=n;i++)en[at[i]]=i;
- for(i=n;i;i--)st[at[i]]=i;
- for(k=1;k<=m;k<<=1);k<<=1;
- j=__builtin_ctz(k)-1;
- for(i=0;i<k;i++)pos[i]=pos[i>>1]>>1|((i&1)<<j);
- for(x=1;x<=at[n];x++){
- for(i=st[x];i<=en[x];i++)for(j=i+1;j<=en[x];j++)if(a[i]>a[j])f[a[i]+m-a[j]]++;
- if(x==1)continue;
- for(i=0;i<k;i++)A[i]=comp();
- for(i=st[x]-1;i;i--)A[a[i]].r+=1.0;
- for(i=st[x];i<=en[x];i++)A[m-a[i]].i+=1.0;
- FFT(A,k,1);
- for(i=0;i<k;i++){
- j=(k-i)&(k-1);
- B[i]=B[i]+A[i]*A[i]-(A[j]*A[j]).conj();
- }
- }
- for(i=0;i<k;i++)B[i]=B[i]*comp(0,-0.25);
- FFT(B,k,-1);
- for(i=1;i<m;i++)ans+=2.0/(i+1)*(f[i+m]+int(B[i+m].r+0.5));
- return printf("%.6f",ans),0;
- }
BZOJ2769 : YY的快速排序的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 痛吻过YY寻找到真爱的三非渣本春招之路
写下这篇文章可能就不是大家乐于见闻的面经了,更多是深入一些面试细节. 前言 我猜拿到了BAT等一线互联网公司Offer的小伙伴或者那些老鸟看到这条标题的时候会不屑一顾,认为YY这种级别的公司是属于二线 ...
- bzoj 2770 YY的Treap
Written with StackEdit. Description 志向远大的\(YY\)小朋友在学完快速排序之后决定学习平衡树,左思右想再加上\(SY\)的教唆,\(YY\)决定学习\(Trea ...
- 【BZOJ2770】YY的Treap 结论+线段树
[BZOJ2770]YY的Treap Description 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了Y ...
- 【bzoj2770】YY的Treap 权值线段树
题目描述 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了YY小朋友Treap(一种平衡树,通过对每个节点随机分 ...
- [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序
用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html 目录 马桶排序(令人 ...
- 算法与数据结构(十六) 快速排序(Swift 3.0版)
上篇博客我们主要聊了比较高效的归并排序算法,本篇博客我们就来介绍另一种高效的排序算法:快速排序.快速排序的思想与归并排序类似,都是采用分而治之的方式进行排序的.快速排序的思想主要是取出无序序列中第一个 ...
- 【需求设计1】VIP积分系统无聊YY
RT,想到什么就写什么呗,这是最简单的方式,顺便给自己做一个记录,反正自己记忆力也不太好.本文是仿陆金所的积分系统,自己YY的一套东西. 首先我想做一个VIP兑换投资卷的功能: 我们先来确定一些我知道 ...
- [算法]——快速排序(Quick Sort)
顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...
随机推荐
- C 替换字符方法
// 444.cpp : Defines the entry point for the console application. // #include "stdafx.h" # ...
- Ruby on Rails 接口无法调试的问题
1. 客户端 ip 与服务器 ip需要在同一网段 2. 如果 rails 版本是4.2及以上需要通过 rails s -b 0.0.0.0启动 3. 跑服务的mac需要关闭防火墙
- java 中的一个项目如何做到访问另一个项目的一个方法 或者 页面
两种方法:1.将一个项目打成jar包,第二个项目进行导入该jar包,就可以使用第一个项目里的类方法属性等2.将第一个项目发布出去,然后第二个项目调用,所谓发布出去就是开发远程接口,允许其他人调用.
- php 投票系统练习
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- .NET开发工具之Excel导出公共类
来源:Pino晨 链接:cnblogs.com/chenxygx/p/5954870.html 说明 最近接了一个任务,就是做一个列表的Excel导出功能.并且有很多页面都会使用这个功能. 导出的Ex ...
- java中常用的工具类(二)
下面继续分享java中常用的一些工具类,希望给大家带来帮助! 1.FtpUtil Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- AJax中post与get请求注意事项
在使用ajax提交表单时,一定要区分提交按钮的形式和数据表头的设置,实例如下: GET请求: HTML代码: <!doctype html> <html lang="en& ...
- [javascript] 使用闭包编写模块
这是一篇[javascript the good parts]的读书笔记. 我们知道可以利用javascript 的prototype 特性为原始类型编写拓展模块.利用如下方法: Object.pro ...
- redmine安装部署
http://www.sxt.cn/u/4647/blog/5557 http://blog.chinaunix.net/uid-26729093-id-4669508.html http://my. ...
- Oracle11g在使用exp导出时不导出空表问题的解决办法
11G中有个新特性,当表无数据时,不分配segment,以节省空间 解决方法: 1.insert一行,再rollback就产生segment了. 该方法是在在空表中插入数据,再删除,则产生segmen ...