题目链接: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-OC多态

    目录: 一.继承的缺陷 二.为什么使用继承 三.组合和聚合 四.多态 回到顶部 一.继承的缺陷 1 提高了程序的复杂度,维护性和扩展性低 2 破坏了类的封装性 回到顶部 二.为什么使用继承 1 代码复 ...

  2. Qt容器类(总结)(新发现的QQueue和QStack,注意全都是泛型)

    Introduction Qt库提供了一组基于模板的一般化的容器类.这些容器可以存储指定的类型的元素.例如,如果你需要一个可变大小的Qstring数组,可以用QVector<QString> ...

  3. LoadRunner监控数据库服务器

    使用LoadRunner的数据库服务器资源监控器,可以在场景或会话步骤运行期间监控DB2.Oracle.SQL Server或Sybase数据库的资源使用率.在场景或会话步骤运行期间,使用这些监控器可 ...

  4. codeforces 148D 概率DP

    题意: 原来袋子里有w仅仅白鼠和b仅仅黑鼠 龙和王妃轮流从袋子里抓老鼠. 谁先抓到白色老师谁就赢. 王妃每次抓一仅仅老鼠,龙每次抓完一仅仅老鼠之后会有一仅仅老鼠跑出来. 每次抓老鼠和跑出来的老鼠都是随 ...

  5. sql: PL/SQL proc

    A PL/SQL block has the following structure: [DECLARE declaration_statements ] BEGIN executable_state ...

  6. TCP与UDP在socket编程中的区别 (网络收集转载)

    http://blog.chinaunix.net/uid-26421509-id-3814684.html 一.TCP与UDP的区别 基于连接与无连接  对系统资源的要求(TCP较多,UDP少)  ...

  7. HDU--杭电--3790--最短路径问题

    最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  8. 2数组的slice和splice方法

    var colors=["blue","red","black","yellow","gray",& ...

  9. javascript 中 事件流和事件冒泡

    一.事件流 是描述页面接受事件的顺序,IE 使用的是时间冒泡流;而Netscape的事件采用的是事件捕获流.1.事件冒泡JS 和 HTML是通过事件的方式实现交互.事件冒泡 开始元素,将事件逐级传递, ...

  10. 基于visual Studio2013解决面试题之0701寻找丑数

     题目