[CF 351B]Jeff and Furik[归并排序求逆序数]

时间:2022-09-06 20:49:24

题意:

两人游戏, 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[归并排序求逆序数]的更多相关文章

  1. poj 2299 Ultra-QuickSort :归并排序求逆序数

    点击打开链接 Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 34676   Accepted ...

  2. POJ2299 Ultra-QuickSort(归并排序求逆序数)

    归并排序求逆序数   Time Limit:7000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u   Descri ...

  3. HDU 3743 Frosh Week(归并排序求逆序数)

    归并排序求逆序数 #include <iostream> #include <cstdio> using namespace std; #define maxn 1000005 ...

  4. hiho一下 第三十九周 归并排序求逆序数

    题目链接:http://hihocoder.com/contest/hiho39/problem/1 ,归并排序求逆序数. 其实这道题也是可以用树状数组来做的,不过数据都比较大,所以要离散化预处理一下 ...

  5. poj 2299 Ultra-QuickSort 归并排序求逆序数对

    题目链接: http://poj.org/problem?id=2299 题目描述: 给一个有n(n<=500000)个数的杂乱序列,问:如果用冒泡排序,把这n个数排成升序,需要交换几次? 解题 ...

  6. POJ训练计划2299&lowbar;Ultra-QuickSort&lpar;归并排序求逆序数&rpar;

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 39279   Accepted: 14163 ...

  7. poj2299解题报告(归并排序求逆序数)

    POJ 2299,题目链接http://poj.org/problem?id=2299 题意: 给出长度为n的序列,每次只能交换相邻的两个元素,问至少要交换几次才使得该序列为递增序列. 思路: 其实就 ...

  8. poj 2299 Ultra-QuickSort &lpar;归并排序 求逆序数&rpar;

    题目:http://poj.org/problem?id=2299 这个题目实际就是求逆序数,注意 long long 上白书上的模板 #include <iostream> #inclu ...

  9. CF 61E 树状数组&plus;离散化 求逆序数加强版 三个数逆序

    http://codeforces.com/problemset/problem/61/E 题意是求 i<j<k && a[i]>a[j]>a[k] 的对数 会 ...

随机推荐

  1. C&plus;&plus;内存动态分配

    https://www.percona.com/blog/2012/07/05/impact-of-memory-allocators-on-mysql-performance/ https://su ...

  2. 二十五、【开源】EFW框架Winform前端开发之强大的自定义控件库

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan ...

  3. Hadoop系列之(一):Hadoop单机部署

    1. Hadoop介绍 Hadoop是一个能够对海量数据进行分布式处理的系统架构. Hadoop框架的核心是:HDFS和MapReduce. HDFS分布式文件系统为海量的数据提供了存储, MapRe ...

  4. viminfo&colon; 无效的启动字符

    当自己进入一个用户,使用vi打开一个文件时,出现以下情况: [gexd@localhost ~]$ vi test.c E575: viminfo: 无效的启动字符 位于行: int main() . ...

  5. Nubia Z5S 官方4&period;4 201内測版 内核版本号信息

    从egl推断内核的的版本号: OpenGL ES Shader Compiler Version: E031.24.00.14 Build Date: 04/29/14 Tue Local Branc ...

  6. add

    前台 <input id="Button1" type="button" value="button" onclick="a ...

  7. ubuntu yolov2 训练自己的数据集

    项目需求+锻炼自己,尝试用yolov2跑自己的数据集,中间遇到了很多问题,记下来防止忘记 一.数据集 首先发现由于物体特殊没有合适的现成的数据集使用,所以只好自己标注,为了减少工作量,先用opencv ...

  8. Bar-Code-Recognition-System Private

    本设计研究EAN13条形码识别的译码技术,在基于机器视觉技术上,构建了一套条形码在线检测识别系统,系统将由以下几个部分构成:条形码图像定位与采集.计算机图像预处理.条形码图像中值滤波去噪.条码解析与识 ...

  9. Redis缓存雪崩、缓存穿透、热点Key解决方案和分析

    缓存穿透 缓存系统,按照KEY去查询VALUE,当KEY对应的VALUE一定不存在的时候并对KEY并发请求量很大的时候,就会对后端造成很大的压力. (查询一个必然不存在的数据.比如文章表,查询一个不存 ...

  10. 关于sqlite使用场景

    对于sqlite,实际中从来没有用过,也几乎没有考虑过其使用场景,更不要说专门去研究它了,今天看最新的数据库流行度排行榜的时候,发现sqlite的长期趋势好像一直在第十位左右徘徊,特地搜索了下其使用场 ...