bzoj2769 YY的快速排序
2016-06-17 20:31
190 查看
真是不想写这题题解。。为了后人不被坑还是写一个吧
首先,题意完全不清啊:每次选出一个数,会像快速排序那样交换前后的顺序,保证前面的数小于它,后面的数大于他,相对顺序不变
其次,标程精度是挂的,开double才能过
再其次,它卡常数,而且很恶心
这TM就是我搞了一下午的三个理由
我们考察每对逆序对的贡献,都是2序列里面值在这两个数之间的个数
然后n2暴力
由于2x取值只有n种,预处理这n种结果,然后累加就行
你问我不预处理是什么结果??TLE!!!
好恶心啊这出题人
首先,题意完全不清啊:每次选出一个数,会像快速排序那样交换前后的顺序,保证前面的数小于它,后面的数大于他,相对顺序不变
其次,标程精度是挂的,开double才能过
再其次,它卡常数,而且很恶心
这TM就是我搞了一下午的三个理由
我们考察每对逆序对的贡献,都是2序列里面值在这两个数之间的个数
然后n2暴力
由于2x取值只有n种,预处理这n种结果,然后累加就行
你问我不预处理是什么结果??TLE!!!
好恶心啊这出题人
//Copyright(c)2016 liuchenrui #include<bits/stdc++.h> #define N 15010 using namespace std; inline void splay(int &v){ v=0;char c=0;int p=1; while(c<'0' || c>'9'){if(c=='-')p=-1;c=getchar();} while(c>='0' && c<='9'){v=(v<<3)+(v<<1)+c-'0';c=getchar();} v*=p; } int n,a ;double p ; map<int,int>ls; int main(){ splay(n); for(int i=1;i<=n;i++){ splay(a[i]);ls[a[i]]=1; } int cnt=0; for(map<int,int>::iterator it=ls.begin();it!=ls.end();++it){ it->second=++cnt; } for(int i=1;i<=n;i++){ a[i]=ls[a[i]]; } double ans=0; for(int i=1;i<=n;i++){ p[i]=2./i; } for(int i=1;i<=n;i++){ int x=a[i]+1; for(int j=i+1;j<=n;j++){ if(a[i]>a[j]){ ans+=p[x-a[j]]; } } } printf("%.6f\n",(double)ans); }
相关文章推荐
- 快速排序
- C#快速排序算法实例分析
- C#递归算法之快速排序
- C++快速排序的分析与优化详解
- php快速排序原理与实现方法分析
- js实现数组冒泡排序、快速排序原理
- php简单实现快速排序的方法
- Java 快速排序(QuickSort)原理及实现代码
- 快速排序和分治排序介绍
- java 算法之快速排序实现代码
- Java实现快速排序算法(Quicktsort)
- Java中的数组排序方式(快速排序、冒泡排序、选择排序)
- 快速排序的原理及java代码实现
- C/C++实现快速排序的方法
- c语言实现冒泡排序、希尔排序等多种算法示例
- 深入单链表的快速排序详解
- C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- JavaScript实现快速排序的方法
- 逐步讲解快速排序算法及C#版的实现示例
- C#使用委托实现的快速排序算法实例