将数字离散化并去重,则对于一对逆序对$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的快速排序相关推荐

  1. bzoj2769 YY的快速排序

    真是不想写这题题解..为了后人不被坑还是写一个吧 首先,题意完全不清啊:每次选出一个数,会像快速排序那样交换前后的顺序,保证前面的数小于它,后面的数大于他,相对顺序不变 其次,标程精度是挂的,开dou ...

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

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

  3. 数据结构上机实验-希尔排序,快速排序,堆排序

    1.希尔排序 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出而得名. ...

  4. Golang TDD实践报告:快速排序Quick Sort

    Golang TDD实践报告:快速排序Quick Sort [阅读时间:约5分钟] 0.项目需求 1.编写符合项目输入输出的一个测试 2.尝试运行测试 3.先使用最少的代码来让失败的测试先跑起来 4. ...

  5. 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/

    大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...

  6. 数据结构学习(十三)、快速排序

    基本思想:通过一趟排序将待排记录分割成独立两个部分,其中一部分记录的关键字均比另一部分记录的关键字小, 则可分别对这两部分继续进行排序,重复操作以上操作,已达到整个序列有序的目的 void Quick ...

  7. 快速排序(快排)--->注释超详细

    基本思想:         1.先选取一个基准值(一般选取数组第一个元素).         2.以第一步选取的基准值为标准,然后从最后一个数值开始一步步向前走将数字与基准值进行比较,如果该值大于基准 ...

  8. 快速排序的两种实现方法(c语言版本)

    经过调研发现,对任意无序整数数组,快速排序有两种实现方法,这里简单阐述下思路: 思路一:随意选择一个基准元,一般选择数组的起始元或末尾元,Weiss这本书上特意搞了个算法来选择基准元,--,总之就是基 ...

  9. 【经典算法】快速排序

    与归并排序一样,快速排序使用也使用了分治的思想.下面是对一个典型的子数组A[p,...,r]进行快速排序的三步分治过程: 分解:数组A[p,...,r]被划分成两个(可能为空)子数组A[P,...,q ...

  10. 20140725 快速排序时间复杂度 sTL入门

    1.快速排序的时间复杂度(平均时间复杂度为) 数组本身就有序时,效果很差为O(n^2) 2.STl入门 (1) C++内联函数(inline)和C中宏(#define)区别 内联函数有类型检查,宏定义 ...

最新文章

  1. 记一次递归在我项目中所发挥的作用
  2. 【设计模式】迭代器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
  3. python怎么输出图像测试_python pyautogui-不检测图像时的位置打印问题
  4. 【收藏】如何避免everything每次都重建索引
  5. Reachable Numbers
  6. C++绝不在构造和析构过程中调用virtual函数
  7. 大神对飞控精准高度估计算法解读
  8. 修改element-ui源码解决穿梭框选择后显示顺序问题
  9. 《那些年啊,那些事——一个程序员的奋斗史》——42
  10. SAP Commerce Cloud 产品主数据读取的单步调试
  11. 让VS Code 支持 Jupyter Notebook
  12. fft qt 代码_最简洁的FFT代码(C++实现)
  13. video标签详解(转载)
  14. ROS Learning-008 beginner_Tutorials ROS话题
  15. Mac安装jdk并配置环境变量
  16. 无线通信设备安装工程概预算编制_南宁市轨道交通5号线一期工程专用无线通信系统设备采购...
  17. Nginx的优点和缺点
  18. Python鼠标模拟
  19. MySQL下执行*.sql文件
  20. meso-四(邻烷氧基苯基)卟啉合钴(meso-T(2-ROP)PCo);meso-四-(N-苄基)吡碇基卟啉锌(ZnTBPyP);离子型锰卟啉化合物[MnTTMAPP][PF6]5齐岳供应

热门文章

  1. 数据结构:最小生成树
  2. 旋转数组的最小数字(牛客网C++代码)
  3. 遥感学习教学课件分享
  4. 【GIS免费精品课程笔记】1 传统数据处理VS大数据处理思维
  5. java m e 获取公钥_Java如何生成公钥和私钥?
  6. 不让登陆_梦幻西游:不让刷活动就直说,到下午3点的时候五开准时掉线
  7. 图片版坦克大战其他相关的 类(三)
  8. 都在这儿了!Flink Forward Asia 最佳参会指南
  9. 一种支持多种流媒体协议的播放内核
  10. 软硬件联合调试步骤_PLC与SCADA或第三方软件的联合仿真调试—NetToPLCSIM