题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394

题意:给你一个n个数的序列,当中组成的数仅仅有0-n,我们能够进行这么一种操作:把第一个数移到最后一个,次数不限。问,在原始数列和最新生成的数列中逆序数最小能够是多少?

刚開始以为须要枚举求逆序数。但最后知道了这个题是有规律的:一个由0-n组成的n个数的数列,当第一个数移到最后一位的时候,整个数列的逆序数会降低x[i](移动前,后面比他小的),会添加n-x[i]-1(移动后,前面比他大的)。

那么这个题就成了单纯求原始数列的逆序数。

之前求逆序数用过归并。也用过线段树,可惜没总结,当时的题目还须要离散化。

如今先总结这个简单的。等继续回想暑假内容的时候会遇到的。

线段树求逆序数

由于线段树善于解决区间问题,那么我们能够用它高速区间求和。我们把每一个数纳入线段树,当新录入一个数之前,统计已经录入的几个数比他大,以此类推,最后的统计和就是逆序数。

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#define LS rt << 1
#define RS rt << 1 | 1
#define LSON l,m,rt << 1
#define RSON m + 1,r,rt << 1 | 1
#define MID (l + r) >> 1
#define MAX 5000 using namespace std; int num[MAX << 2];
int x[MAX + 10]; inline void pushup(int rt)
{
num[rt] = num[LS] + num[RS];
} void build(int l,int r,int rt)
{
num[rt] = 0; if(l == r)
return ; int m = MID;
build(LSON);
build(RSON);
} void update(int p,int l,int r,int rt)
{
if(l == r)
{
num[rt]++;
return ;
} int m = MID; if(p <= m)
update(p,LSON);
else
update(p,RSON); pushup(rt);
} int query(int ql,int qr,int l,int r,int rt)
{
if(l >= ql && r <= qr)
{
return num[rt];
} int m = MID;
int ret = 0; if(ql <= m)
ret += query(ql,qr,LSON);
if(qr > m)
ret += query(ql,qr,RSON); return ret;
} int main()
{
int n; while(~scanf("%d",&n))
{
int sum = 0; build(0,n - 1,1); for(int i = 0;i < n;i++)
{
scanf("%d",&x[i]);
sum += query(x[i],n - 1,0,n - 1,1);
update(x[i],0,n - 1,1);
} int ans = sum; for(int i = 0;i < n;i++)
{
//0-n的数,把第一个数移到最后一位后
//整个数列的逆序数会降低x[i](移动前,后面比他小的)
//会添加n-x[i]-1(移动后。前面比他大的)
sum += n - x[i] - x[i] - 1;
ans = min(ans,sum);
} printf("%d\n",ans);
}
return 0;
}

HDU 1394 Minimum Inversion Number (线段树 单点更新 求逆序数)的更多相关文章

  1. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  2. hdu 1394 Minimum Inversion Number (裸树状数组 求逆序数 && 归并排序求逆序数)

    题目链接 题意: 给一个n个数的序列a1, a2, ..., an ,这些数的范围是0-n-1, 可以把前面m个数移动到后面去,形成新序列:a1, a2, ..., an-1, an (where m ...

  3. hdu 1394 Minimum Inversion Number (树状数组求逆序对)

    The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that ...

  4. hdu - 1394 Minimum Inversion Number(线段树水题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1394 很基础的线段树. 先查询在更新,如果后面的数比前面的数小肯定会查询到前面已经更新过的值,这时候返回的sum ...

  5. [HDU] 1394 Minimum Inversion Number [线段树求逆序数]

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  6. HDU 1394 Minimum Inversion Number 线段树

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=1394 没看到多组输入,WA了一万次...... 其实很简单,有人暴力过得,我感觉归并排序.二叉排序树求逆 ...

  7. HDU 1394 Minimum Inversion Number(线段树 或 树状数组)

    题目大意:给出从 0 到 n-1 的整数序列,A0,A1,A2...An-1.可将该序列的前m( 0 <= m < n )个数移到后面去,组成其他的序列,例如当 m=2 时,得到序列 A2 ...

  8. HDU 1754 I Hate It 线段树单点更新求最大值

    题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...

  9. HDU 1394 Minimum Inversion Number (树状数组)

    题目链接 Problem Description The inversion number of a given number sequence a1, a2, ..., an is the numb ...

随机推荐

  1. 05-UIKit(UITableViewController)

    目录: 一.UITableViewController(表视图控制器) 二.委托协议 三.tableview工作过程(三问一响应) 四.UITableViewCell 回到顶部 一.UITableVi ...

  2. 浅尝key-value数据库(三)——MongoDB的分布式

    浅尝key-value数据库(三)——MongoDB的分布式 测试了单机MongoDB的随机读和写入性能,这一节来讲一讲MongoDB的分布式. MongoDB的分布式分成两种,一种是Replicat ...

  3. 清华集训2014 day1 task2 主旋律

    题目 这可算是一道非常好的关于容斥原理的题了. 算法 好吧,这题我毫无思路,直接给正解. 首先,问题的正面不容易求,那么就求反面吧: 有多少种添加边的方案,使得这个图是DAG图(这里及以下所说的DAG ...

  4. CSharp Algorithm - Replace multiplication operator with a method

    /* Author: Jiangong SUN */ How to replace multiplication operation with a method? For example, you h ...

  5. NGUI 3.5教程(二)Label 标签 (Hello world)、多行文本

    写在前面:     本文将创建NGUI的第一个样例.依照编程传统,第一个样例,就是做一个Hello world 显示出来.NGUI.我们用Label来实现 . 欢迎大家纠错.拍砖!原创非常辛苦,如有转 ...

  6. JS乘法口诀表(一行代码)

    (function(c){for(i=1;i<=9;i++){var s='';for(j=1;j<=i;j++){s+=i+'X'+j+'='+i*j+'\t';}c.debug(s); ...

  7. C#_事件

    C#_事件 概述 今天用来演示事件的例子是模拟实现一个文件下载类,在这个类中我将定义一个DownLoad事件,这个事件用来在文件下载的过程中,向订阅这个事件的用户发出消息,而这个消息将用DownLoa ...

  8. perl $d = encode_utf8($r); $f = decode_json($d)

    [root@dr-mysql01 ~]# cat a1.pl my $url="http://192.168.32.101:3000/api/getcode?env=zj&phone ...

  9. use EXPORT和use EXPORT_OK

    我不明白 use EXPORT和use EXPORT_OK的区别,大多数资料提到了一些: @Export 允许 导出模块的函数和变量到用户的名字空间使用标准的导入方法. 这种方式,我们不需要创建模块的 ...

  10. 跟Google学习Android开发-起始篇-与其它应用程序交互(1)

    6 与其它应用程序交互 一个Android应用程序通常有多个活动.每一项活动都将显示一个用户界面,允许用户执行某种特定任务(如查看地图或者照片).为了把用户从一个活动带到另一个,你的应用必须使用Int ...