JZOJ 3462. 【NOIP2013模拟联考5】休息(rest)

traveller-ly 2018-07-19 原文

JZOJ 3462. 【NOIP2013模拟联考5】休息(rest)

Description

休息的时候,可以放松放松浑身的肌肉,打扫打扫卫生,感觉很舒服。在某一天,某LMZ 开始整理他那书架。已知他的书有n 本,从左到右按顺序排列。他想把书从矮到高排好序,而每一本书都有一个独一无二的高度Hi。他排序的方法是:每一次将所有的书划分为尽量少的连续部分,使得每一部分的书的高度都是单调下降,然后将其中所有不少于2 本书的区间全部翻转。重复执行以上操作,最后使得书的高度全部单调上升。可是毕竟是休息时间,LMZ 不想花太多时间在给书排序这种事上面。因此他划分并翻转完第一次书之后,他想计算,他一共执行了多少次翻转操作才能把所有的书排好序。LMZ 惊奇地发现,第一次排序之前,他第一次划分出来的所有区间的长度都是偶数。
 

Input

第一行一个正整数n, 为书的总数。

接下来一行n个数,第i个正整数Hi,为第i 本书的高度。

Output

仅一个整数,为LMZ 需要做的翻转操作的次数。
 

Sample Input

6
5 3 2 1 6 4

Sample Output

3
【样例解释】
第一次划分之后,翻转(5,3,2,1),(6,4)。之后,书的高度为1 2 3 5 4 6,然后便是翻转(5,4)即可。
 
 
做法:

一个并不明显的性质是,在对原序列进行第一次划分过后,以后
的每次划分得到的各个部分都恰好由两个数组成。 这是因为在第一次划分和
第一轮的翻转之后,原数列由若干个单调增序列拼接而成,形式如下:a1, a2…
ai, b1, b2…bj…z1…zk.考虑相邻两个部分,不妨设为 a 部分和 b 部分,其中 ai
和 b1前后相邻。若 ai<b1则可以合并成同一部分,否则会形成块(ai, b1),并
且在下一轮翻转,成为…ai-1, b1, ai, b2…。可以发现在这以后,由于有 ai-1<ai,
则 ai-1与 ai不会在同一个块里;同理 b1和 b2不会在同一个块里。即,任意连
续三个数必定不会是单调递减的。 那么,这以后每次翻转都只会将相邻的逆
序对交换。由于这个算法最终可以正确地得到结果,所以第一轮以后进行的
翻转操作数就等于第一轮之后序列的逆序对数。而第一轮的翻转数我们可以
直接模拟得到。 求一个序列的逆序对数的经典做法是归并排序,同时记录。
时间复杂度 O(nlog2n)

代码如下:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <string>
 5 #include <algorithm>
 6 #include <cmath>
 7 #define N 100007
 8 #define LL long long
 9 using namespace std;
10 int n, a[N], b[N], tot;
11 LL ans;
12 
13 void cl(int l, int r)
14 {
15     for (int i = l; i >= r; i--)
16     a[++tot] = b[i];
17     ans++;
18 }
19 
20 inline void merge(int l, int mid, int r)
21 {
22     int i = l, j = mid + 1;
23     for (int k = l; k <= r; k++)
24         if (j > r || i <= mid && a[i] < a[j])    b[k] = a[i++];
25         else b[k] = a[j++], ans += mid - i + 1;
26     for (int k = l; k <= r; k++)    a[k] = b[k];
27 }
28 
29 inline void mergeSort(int a, int b)
30 {
31     int mid = (a + b) / 2;
32     if (a < b)
33     {
34         mergeSort(a, mid);
35         mergeSort(mid + 1, b);
36         merge(a, mid, b); 
37     }
38 }
39 
40 int main()
41 {
42     scanf("%d", &n);
43     for (int i = 1; i <= n; i++)
44         scanf("%d", &b[i]);
45     int i = 1, j = 1;
46     while (i <= n)
47     {
48         while (b[i] > b[i + 1] && i < n)    i++;
49         cl(i, j);
50         j = i + 1;
51         i++;
52     }
53     memset(b, 0 ,sizeof(b));
54     mergeSort(1, n);
55     cout << ans;
56 }

View Code

 

 

 

 

 

 

 

发表于 2018-07-19 21:46 执迷于沿途风景的旅人 阅读() 评论() 编辑 收藏

 

版权声明:本文为traveller-ly原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/traveller-ly/p/9338621.html

JZOJ 3462. 【NOIP2013模拟联考5】休息(rest)的更多相关文章

  1. JZOJ 3382. 【NOIP2013模拟】七夕祭 (Standard IO)

    JZOJ 3382. 【NOIP2013模拟】七夕祭 (Standard IO) 3382. 【NOIP201 […]...

  2. JZOJ 3385. 【NOIP2013模拟】黑魔法师之门

    JZOJ 3385. 【NOIP2013模拟】黑魔法师之门 3385. 【NOIP2013模拟】黑魔法师之门  […]...

  3. JZOJ 1266. 玉米田

    JZOJ 1266. 玉米田 1266. 玉米田(cowfood.pas/c/cpp) (File IO):  […]...

  4. JZOJ 3223. 【HBOI2013】Ede的新背包问题

    JZOJ 3223. 【HBOI2013】Ede的新背包问题 3223. 【HBOI2013】Ede的新背包问 […]...

  5. JZOJ 4269. 【NOIP2015模拟10.27】挑竹签

    JZOJ 4269. 【NOIP2015模拟10.27】挑竹签 4269. 【NOIP2015模拟10.27】 […]...

  6. JZOJ 2136. 【GDKOI2004】汉诺塔

    JZOJ 2136. 【GDKOI2004】汉诺塔 2136. 【GDKOI2004】汉诺塔 (Standar […]...

  7. JZOJ 3509. 【NOIP2013模拟11.5B组】倒霉的小C

    JZOJ 3509. 【NOIP2013模拟11.5B组】倒霉的小C 3509. 【NOIP2013模拟11. […]...

  8. JZOJ 1264. 乱头发节

    JZOJ 1264. 乱头发节 1264. 乱头发节(badhair.pas/c/cpp) (File IO) […]...

随机推荐

  1. php计算工作日

      在做政府项目时经常会遇到要就算工作日的情况,在网上找了一圈就只有一些告诉大家怎么做的没有可以拿来就用的代码 […]...

  2. java四种线程池的使用

    参考:https://blog.csdn.net/w05980598/article/details/7942 […]...

  3. 记录我的 python 学习历程-Day02-while 循环/格式化输出/运算符/编码的初识

    一、流程控制之–while 循环 循环就是重复做同一件事,它可以终止当前循环,也可以跳出这一次循环 […]...

  4. ​《数据库系统概念》2-存储、事务等的简介

      ​   一、关系型数据库简介a)DMLSQL语言是非过程的,一次查询中,可以输入多张表,但结果只是一张表。 […]...

  5. Redis 学习笔记(篇九):主从复制

    Redis 中,可以通过执行 savleof 命令或者设置 slaveof 选项,让一个服务器去复制另一个服务 […]...

  6. Note of Jieba ( 词云图实例 )

      Note of Jieba jieba库是python 一个重要的第三方中文分词函数库,但需要用户自行安装 […]...

  7. 极致21点开发DAY2

    今天完成的主要内容时MainScene场景中设置面板的开发。游戏逻辑:点击设置按钮,弹出音乐设置弹框,弹框内容 […]...

  8. ajax获取后台数据,显示到input输入框里面

    从后台获取数据放在输入框中 function readCard() { $.ajax({ url:\'/Get […]...

展开目录

目录导航