将数字离散化并去重,则对于一对逆序对$i<j$,$a_i>a_j$,贡献为$\frac{2}{a_i-a_j+1}$,因此只要对于每个差值统计出对应的逆序对个数即可。

将序列分块,块内平方暴力,块与块之间做FFT即可。

时间复杂度$O(n\sqrt{n\log n})$。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cmath>
  4. using namespace std;
  5. const int N=33000;
  6. int n,m,x,i,j,k,pos[N],a[N],b[N],at[N],st[N],en[N],f[N];double ans;
  7. struct comp{
  8. double r,i;comp(double _r=0,double _i=0){r=_r;i=_i;}
  9. comp operator+(const comp&x){return comp(r+x.r,i+x.i);}
  10. comp operator-(const comp&x){return comp(r-x.r,i-x.i);}
  11. comp operator*(const comp&x){return comp(r*x.r-i*x.i,r*x.i+i*x.r);}
  12. comp conj(){return comp(r,-i);}
  13. }A[N],B[N];
  14. const double pi=acos(-1.0);
  15. void FFT(comp a[],int n,int t){
  16. for(int i=1;i<n;i++)if(i<pos[i])swap(a[i],a[pos[i]]);
  17. for(int d=0;(1<<d)<n;d++){
  18. int m=1<<d,m2=m<<1;
  19. double o=pi*2/m2*t;comp _w(cos(o),sin(o));
  20. for(int i=0;i<n;i+=m2){
  21. comp w(1,0);
  22. for(int j=0;j<m;j++){
  23. comp&A=a[i+j+m],&B=a[i+j],t=w*A;
  24. A=B-t;B=B+t;w=w*_w;
  25. }
  26. }
  27. }
  28. if(t==-1)for(int i=0;i<n;i++)a[i].r/=n;
  29. }
  30. inline int lower(int x){
  31. int l=1,r=m,mid,t;
  32. while(l<=r)if(b[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
  33. return t;
  34. }
  35. int main(){
  36. scanf("%d",&n);
  37. for(i=1;i<=n;i++)scanf("%d",&a[i]),b[i]=a[i];
  38. sort(b+1,b+n+1);
  39. for(i=1;i<=n;i++)if(i==1||b[i]!=b[i-1])b[++m]=b[i];
  40. for(i=1;i<=n;i++)a[i]=lower(a[i]);
  41. for(i=1;i<=n;i++)at[i]=(i-1)/1500+1;
  42. for(i=1;i<=n;i++)en[at[i]]=i;
  43. for(i=n;i;i--)st[at[i]]=i;
  44. for(k=1;k<=m;k<<=1);k<<=1;
  45. j=__builtin_ctz(k)-1;
  46. for(i=0;i<k;i++)pos[i]=pos[i>>1]>>1|((i&1)<<j);
  47. for(x=1;x<=at[n];x++){
  48. 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]]++;
  49. if(x==1)continue;
  50. for(i=0;i<k;i++)A[i]=comp();
  51. for(i=st[x]-1;i;i--)A[a[i]].r+=1.0;
  52. for(i=st[x];i<=en[x];i++)A[m-a[i]].i+=1.0;
  53. FFT(A,k,1);
  54. for(i=0;i<k;i++){
  55. j=(k-i)&(k-1);
  56. B[i]=B[i]+A[i]*A[i]-(A[j]*A[j]).conj();
  57. }
  58. }
  59. for(i=0;i<k;i++)B[i]=B[i]*comp(0,-0.25);
  60. FFT(B,k,-1);
  61. for(i=1;i<m;i++)ans+=2.0/(i+1)*(f[i+m]+int(B[i+m].r+0.5));
  62. return printf("%.6f",ans),0;
  63. }

  

BZOJ2769 : YY的快速排序的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. 痛吻过YY寻找到真爱的三非渣本春招之路

    写下这篇文章可能就不是大家乐于见闻的面经了,更多是深入一些面试细节. 前言 我猜拿到了BAT等一线互联网公司Offer的小伙伴或者那些老鸟看到这条标题的时候会不屑一顾,认为YY这种级别的公司是属于二线 ...

  3. bzoj 2770 YY的Treap

    Written with StackEdit. Description 志向远大的\(YY\)小朋友在学完快速排序之后决定学习平衡树,左思右想再加上\(SY\)的教唆,\(YY\)决定学习\(Trea ...

  4. 【BZOJ2770】YY的Treap 结论+线段树

    [BZOJ2770]YY的Treap Description 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了Y ...

  5. 【bzoj2770】YY的Treap 权值线段树

    题目描述 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了YY小朋友Treap(一种平衡树,通过对每个节点随机分 ...

  6. [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

    用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  目录 马桶排序(令人 ...

  7. 算法与数据结构(十六) 快速排序(Swift 3.0版)

    上篇博客我们主要聊了比较高效的归并排序算法,本篇博客我们就来介绍另一种高效的排序算法:快速排序.快速排序的思想与归并排序类似,都是采用分而治之的方式进行排序的.快速排序的思想主要是取出无序序列中第一个 ...

  8. 【需求设计1】VIP积分系统无聊YY

    RT,想到什么就写什么呗,这是最简单的方式,顺便给自己做一个记录,反正自己记忆力也不太好.本文是仿陆金所的积分系统,自己YY的一套东西. 首先我想做一个VIP兑换投资卷的功能: 我们先来确定一些我知道 ...

  9. [算法]——快速排序(Quick Sort)

    顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...

随机推荐

  1. C 替换字符方法

    // 444.cpp : Defines the entry point for the console application. // #include "stdafx.h" # ...

  2. Ruby on Rails 接口无法调试的问题

    1. 客户端 ip 与服务器 ip需要在同一网段 2. 如果 rails 版本是4.2及以上需要通过 rails s -b 0.0.0.0启动 3. 跑服务的mac需要关闭防火墙

  3. java 中的一个项目如何做到访问另一个项目的一个方法 或者 页面

    两种方法:1.将一个项目打成jar包,第二个项目进行导入该jar包,就可以使用第一个项目里的类方法属性等2.将第一个项目发布出去,然后第二个项目调用,所谓发布出去就是开发远程接口,允许其他人调用.

  4. php 投票系统练习

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. .NET开发工具之Excel导出公共类

    来源:Pino晨 链接:cnblogs.com/chenxygx/p/5954870.html 说明 最近接了一个任务,就是做一个列表的Excel导出功能.并且有很多页面都会使用这个功能. 导出的Ex ...

  6. java中常用的工具类(二)

    下面继续分享java中常用的一些工具类,希望给大家带来帮助! 1.FtpUtil           Java   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  7. AJax中post与get请求注意事项

    在使用ajax提交表单时,一定要区分提交按钮的形式和数据表头的设置,实例如下: GET请求: HTML代码: <!doctype html> <html lang="en& ...

  8. [javascript] 使用闭包编写模块

    这是一篇[javascript the good parts]的读书笔记. 我们知道可以利用javascript 的prototype 特性为原始类型编写拓展模块.利用如下方法: Object.pro ...

  9. redmine安装部署

    http://www.sxt.cn/u/4647/blog/5557 http://blog.chinaunix.net/uid-26729093-id-4669508.html http://my. ...

  10. Oracle11g在使用exp导出时不导出空表问题的解决办法

    11G中有个新特性,当表无数据时,不分配segment,以节省空间 解决方法: 1.insert一行,再rollback就产生segment了. 该方法是在在空表中插入数据,再删除,则产生segmen ...