[CF 351B]Jeff and Furik[归并排序求逆序数]
题意:
两人游戏, J先走.
给出一个1~n的排列, J选择一对相邻数[题意!!~囧], 交换.
F接着走, 扔一硬币, 若正面朝上, 随机选择一对降序排列的相邻数, 交换. 若反面朝上, 随机选择一对升序排列的相邻数, 交换.
当数列成为严格升序的时候游戏结束.
求让游戏尽早结束的情况下, 移动次数的期望.
思路:
首先分析游戏结束的方法: 由于是排列, 严格升序就是1~n. J的话..直接按顺序将较小的数交换到目标位置即可. F的话...比较麻烦, 有两种可能, 每种可能都是随机的.....就会破坏J的结果....
这样的话就要进死胡同了....
需要深刻理解"期望"...就是概率相消会认为是事实... 分析第二个人, 他一半是随机选择升序变降序, 一半是随机选择降序变升序...YY一下, 可以认为F啥也没干...
那就直接求J走的步数, F只是起到填充的作用...注意F必须走偶数步使得他自己的作用可以中和掉.
下面就是模拟一下样例: 对于某个数, 它移动的次数就是在它前面比他大的数的个数[逆序数], 在他前面比他小的数不需要被它超越. 而他本身的移动将排列分成三个区间, 前面没涉及的部分, 逆序数显然没影响, 中间跨过的部分, 它的到来并不会使这些数的逆序数增加, 更不会减少, 他后面的部分, 显然也是没有影响... 因此, 只要计算整个排列的逆序数的个数即可.
线段树可以算逆序数...但是好麻烦吧...
归并排序求逆序数:
冒泡也可以求逆序数..就相当于是这个游戏的模拟解法..O(n^2), 反而是冒泡为什么可以求出逆序数可以由此题的分析过程得出...
归并的话, O(nlogn)...
基本操作是将左右两个有序数组合并. 左右两个数组内部的排序对逆序数的改变只影响其内部, 所以可以分层累加.
合并时, 从左边来的数的逆序数都不变, 每从右边来一个数, 它的逆序数就增加"左边剩余数"的个数. 所有的都累加一下就可以了.
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 3005;
int p[MAXN],n,cnt,t[MAXN];
void mrg(int l, int r)
{
int mid = (l + r) >> 1;
int i = l, j = mid + 1, k = 0;
while(i<=mid && j<=r)
if(p[i]<p[j]) t[k++] = p[i++];
else
{
t[k++] = p[j++];
cnt += mid - i + 1;
}
if(i>mid)
while(j<=r) t[k++] = p[j++];
else
while(i<=mid) t[k++] = p[i++];
for(i=0;i<k;i++)
p[l+i] = t[i];
}
void srt(int l, int r)
{
if(l<r)
{
int mid = (l + r) >> 1;
srt(l, mid);
srt(mid+1,r);
mrg(l,r);
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",p+i);
srt(0, n-1);
printf("%.6lf\n",(double)((cnt&1)?((cnt<<1)-1):cnt<<1));
}
[CF 351B]Jeff and Furik[归并排序求逆序数]的更多相关文章
- poj 2299 Ultra-QuickSort :归并排序求逆序数
点击打开链接 Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 34676 Accepted ...
- POJ2299 Ultra-QuickSort(归并排序求逆序数)
归并排序求逆序数 Time Limit:7000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Descri ...
- HDU 3743 Frosh Week(归并排序求逆序数)
归并排序求逆序数 #include <iostream> #include <cstdio> using namespace std; #define maxn 1000005 ...
- hiho一下 第三十九周 归并排序求逆序数
题目链接:http://hihocoder.com/contest/hiho39/problem/1 ,归并排序求逆序数. 其实这道题也是可以用树状数组来做的,不过数据都比较大,所以要离散化预处理一下 ...
- poj 2299 Ultra-QuickSort 归并排序求逆序数对
题目链接: http://poj.org/problem?id=2299 题目描述: 给一个有n(n<=500000)个数的杂乱序列,问:如果用冒泡排序,把这n个数排成升序,需要交换几次? 解题 ...
- POJ训练计划2299_Ultra-QuickSort(归并排序求逆序数)
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 39279 Accepted: 14163 ...
- poj2299解题报告(归并排序求逆序数)
POJ 2299,题目链接http://poj.org/problem?id=2299 题意: 给出长度为n的序列,每次只能交换相邻的两个元素,问至少要交换几次才使得该序列为递增序列. 思路: 其实就 ...
- poj 2299 Ultra-QuickSort (归并排序 求逆序数)
题目:http://poj.org/problem?id=2299 这个题目实际就是求逆序数,注意 long long 上白书上的模板 #include <iostream> #inclu ...
- CF 61E 树状数组+离散化 求逆序数加强版 三个数逆序
http://codeforces.com/problemset/problem/61/E 题意是求 i<j<k && a[i]>a[j]>a[k] 的对数 会 ...
随机推荐
- storm简介[ZZ]
场景 伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样.更加便捷,同时对于信息的时效性要求也越来越高.举个搜索 场景中的例子,当一个卖家发布了一条宝贝信息时,他希望的 ...
- 半质数的个数 csdn 英雄会 高校俱乐部
2·14 情人&元宵节专题:半质数的个数. 题目:质数是大家熟知的概念,我们定义一个半质数的概念:如果一个数恰好是两个质数的乘积(可以相同),则称它为半质数.前几个半质数是 4, 6, 9, ...
- Java环境变量配置&解决版本不一致问题
之前用Myeclipse编译运行Java没有问题 但是突然想用简单点的NotePad++以及cmd直接编译运行Java 这就让我倒腾了一晚上 先说下问题的解决,再总结下查阅的一些知识. 1.进行win ...
- Qt事件循环与状态机事件循环的思考
写下这个给自己备忘,关于事件循环以及多线程方面的东西我还需要多多学习.首先我们都知道程序有一个主线程,在GUI程序中这个主线程也叫GUI线程,图形和绘图相关的函数都是由主线程来提供.主线程有个事件循环 ...
- 【原创】CMD常用命令:解决实际问题
1.查找某一目录下后缀名文某某的所有文件. 命令格式:dir *.mp3 /a -d/b/s >C:\Users\leemo\Desktop\total.txt MP3为文件后缀名.>是命 ...
- 从一个标准 url 里取出文件的扩展名
在php预定义函数中有一个叫做"pathinfo()"的函数,专门用于返回文件路径信息的. 那好,我们就来看一下它能为我们做些什么? 语法:pathinfo($url_ ...
- 302重定向,MVC中的Get,Post请求。
1.在访问页遇到重定向,Get,Post跳转处理,在跳转后的页面获取访问端的IP,他们的IP是否发生变化... 2.重定向处理后获取的IP还是访问端IP,而用Get,Post请求处理后,获取的访问端I ...
- 【转载】HRTF音频3D定位技术综述
1. 序 您一定有过这样的经验:在一个炎热的夏夜,讨厌的蚊子在你的耳边飞舞.此时,没有比除掉这个祸害更急所的了,对吧?做到这一点,不必睁大了眼去找蚊子,只需依靠敏锐的听力,一样可以确定蚊子的方位,在漆 ...
- 这篇blog只是为了发一张图链到UOJ的博客去..
UOJ卖萌表情,萌萌哒VFK如图.
- RedHat 6.5 离线安装 apache2.4.23
第一部分:安装gcc等 rpm -ivh mpfr-2.4.1-6.el6.x86_64.rpm rpm -ivh ppl-0.10.2-11.el6.x86_64.rpm rpm -ivh cpp- ...