【题目描述】

给定一个序列a1...an,每次可以吧第一个元素放到最后形成一个新的序列,求解这n个序列中逆序数最小的一个。

【思路】

线段树的应用——利用线段树求解逆序数。

一组逆序对ai,aj满足ai>aj&&i<j,求解时先进行排序,找出没个数的相对大小。

插入的时候从最后一个开始向前一次插入,每次将x[i]插入到k时。询问1...k这段中已插入的个数。

因为1...k这段中已插入的个数即为排在x[i]之后并且比x[i]小的数的个数,即为包含x[i]的逆序对总数。

求出原序列的逆序对数之后,每次变更之后的逆序数可以提出来。

#include<cstdio>
#include<algorithm>
#define lson n<<1
#define rson n<<1|1
#define N 50100
using namespace std;
struct{int l,r,cnt;
}s[N<<2];
int x[N];
void build(int l,int r,int n){s[n].l=l;s[n].r=r;s[n].cnt=0;if(l==r)return;int mid=(l+r)>>1;build(l,mid,lson);build(mid+1,r,rson);
}
void update(int n,int k){s[n].cnt++;if(s[n].l==s[n].r)return;int mid=(s[n].l+s[n].r)>>1;if(k<=mid)update(lson,k);elseupdate(rson,k);
}
int query(int l,int r,int n){if(s[n].l==l&&r==s[n].r)return s[n].cnt;int mid=(s[n].l+s[n].r)>>1;if(r<=mid)return query(l,r,lson);else if(l>mid)return query(l,r,rson);elsereturn query(l,mid,lson)+query(mid+1,r,rson);
}
int main(){int n;while(~scanf("%d",&n)){int ans=0;build(1,n,1);for(int i=1;i<=n;i++)scanf("%d",&x[i]);for(int i=n;i>0;i--){ans+=query(1,x[i]+1,1);update(1,x[i]+1);}int min=ans;for(int i=1;i<=n;i++){ans=ans+n-2*x[i]-1;min=min<ans?min:ans;}printf("%d\n",min);}return 0;
}

转载于:https://www.cnblogs.com/silver-bullet/archive/2012/07/03/2732294.html

HDOJ 1394 Minimum Inversion Number相关推荐

  1. 逆序数2 HDOJ 1394 Minimum Inversion Number

    题目传送门 1 /* 2 求逆序数的四种方法 3 */ 1 /* 2 1. O(n^2) 暴力+递推 法:如果求出第一种情况的逆序列,其他的可以通过递推来搞出来,一开始是t[1],t[2],t[3]. ...

  2. HDU 1394 Minimum Inversion Number(线段树的单点更新)

    点我看题目 题意 :给你一个数列,a1,a2,a3,a4.......an,然后可以求出逆序数,再把a1放到an后,可以得到一个新的逆序数,再把a2放到a1后边,,,,,,,依次下去,输出最小的那个逆 ...

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

    题目链接:点击查看 题目大意:线段树求逆序数,给出的数列可以组成环,问怎么样求可以让逆序数最小,输出最小值 题目分析:看到这个题的第一反应是暴力枚举5000种情况,因为感觉这个题的N给的不是很大,但是 ...

  4. HUOJ 1394 Minimum Inversion Number

    本题两种解法,暴搜,线段树,线段树只是处理最初序列,找出最初的逆序数,之后每次移动为当前逆序数+比移动数大的数-比移动数小的数. 做本题时完全没有想法,完全没有~copy胡浩大神代码,第一次抄错题.. ...

  5. HDOJ1394 Minimum Inversion Number【线段树】

    需要注意的就是给出的数是0~n-1,而线段树根节点范围是1-n 所以main中insert要num[i]+1. 当然,根节点范围换成0~n-1就不需要了. Problem : 1394 ( Minim ...

  6. Minimum Inversion Number HDU - 1394(权值线段树/树状数组)

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

  7. Minimum Inversion Number HDU - 1394(求一个数字环的逆序对+多种解法)

    题意: 给出n个数(0~n-1,每个数仅出现一次),问它长为n的循环序列中逆序对最少的数量. 多种解法:暴力+树状数组+分治+规律推导公式 题目: The inversion number of a ...

  8. [HDU1394]Minimum Inversion Number

    题目:Minimum Inversion Number 链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 分析: 1)先对序列求逆序对的数目,归并排序 ...

  9. Minimum Inversion Number 线段树

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

  10. hdu1394 Minimum Inversion Number 线段树和树状数组

    题意: 输入一个长度 n 第二行给出长度为n的数组,数组的值刚好为0到n-1这n个数. 然后每次把数组的第一个数放到最后一个,放n-1次,共有n个排列,这n个排列就有n个逆序数,输出这n个逆序数的最小 ...

最新文章

  1. 360金融携手上海交大共建AI实验室,开启人才战略新布局
  2. Java类的连接与初始化 (及2013阿里初始化笔试题解析)
  3. 中国半光漆市场需求前景与投资规划研究报告2021年版
  4. 209. Minimum Size Subarray Sum 长度最小的子数组
  5. python 通登录银行_Python3 适合初学者学习的银行账户登录系统实例
  6. 第二十五期:知乎用Go替代Python,说明了啥
  7. WinForm控件之【LinkLabel】
  8. python合法的变量名有哪些_Python判断变量名是否合法的方法示例
  9. 启动Eclipse 报错:java was started but returned exit
  10. si4463的寄存器使用说明
  11. 英语介绍嵌入式计算机,计算机专业的英文自我介绍
  12. mysql的默认隔离等级_mysql 四种隔离级别
  13. 标准成本和实际成本的比较
  14. 语音信号处理--基音检测实验
  15. 基于人本理念的绩效管理体系设计(一)
  16. 电泵井php和psi,电泵井测压安全技术.doc
  17. 2007年最杰出十大新锐站长评选-------关注!
  18. 以面试官的角度来看 React 工作面试
  19. Java连接Access 2013
  20. 小学计算机游戏,小学作文:玩电脑游戏

热门文章

  1. 如何做一个让开发人员看得起的软件测试人员
  2. [转] 谈谈MIXI的开源SNS架构
  3. Mac Unable to save settings: Failed to save settings. Please restart IntelliJ IDEA
  4. 浅谈Spark几种不同的任务提交相关脚本(以Spark 1.5.0为例)
  5. 浅谈Eclipse dropins插件安装的坑(附m2e的各个版本插件下载)
  6. 小型电商Web架构!小而美!值得学习!
  7. 免费自学编程的12个网站
  8. 看了Google大神Jeff Dean的传说后,我跪了!这才是真的大神
  9. 阿里巴巴中台技术架构实践与思考
  10. 微服务架构实战(一):微服务架构的优势与不足