HDOJ 1394 Minimum Inversion Number
【题目描述】
给定一个序列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相关推荐
- 逆序数2 HDOJ 1394 Minimum Inversion Number
题目传送门 1 /* 2 求逆序数的四种方法 3 */ 1 /* 2 1. O(n^2) 暴力+递推 法:如果求出第一种情况的逆序列,其他的可以通过递推来搞出来,一开始是t[1],t[2],t[3]. ...
- HDU 1394 Minimum Inversion Number(线段树的单点更新)
点我看题目 题意 :给你一个数列,a1,a2,a3,a4.......an,然后可以求出逆序数,再把a1放到an后,可以得到一个新的逆序数,再把a2放到a1后边,,,,,,,依次下去,输出最小的那个逆 ...
- HDU - 1394 Minimum Inversion Number(树状数组)
题目链接:点击查看 题目大意:线段树求逆序数,给出的数列可以组成环,问怎么样求可以让逆序数最小,输出最小值 题目分析:看到这个题的第一反应是暴力枚举5000种情况,因为感觉这个题的N给的不是很大,但是 ...
- HUOJ 1394 Minimum Inversion Number
本题两种解法,暴搜,线段树,线段树只是处理最初序列,找出最初的逆序数,之后每次移动为当前逆序数+比移动数大的数-比移动数小的数. 做本题时完全没有想法,完全没有~copy胡浩大神代码,第一次抄错题.. ...
- HDOJ1394 Minimum Inversion Number【线段树】
需要注意的就是给出的数是0~n-1,而线段树根节点范围是1-n 所以main中insert要num[i]+1. 当然,根节点范围换成0~n-1就不需要了. Problem : 1394 ( Minim ...
- 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 ...
- Minimum Inversion Number HDU - 1394(求一个数字环的逆序对+多种解法)
题意: 给出n个数(0~n-1,每个数仅出现一次),问它长为n的循环序列中逆序对最少的数量. 多种解法:暴力+树状数组+分治+规律推导公式 题目: The inversion number of a ...
- [HDU1394]Minimum Inversion Number
题目:Minimum Inversion Number 链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 分析: 1)先对序列求逆序对的数目,归并排序 ...
- Minimum Inversion Number 线段树
The inversion number of a given number sequence a1, a2, -, an is the number of pairs (ai, aj) that s ...
- hdu1394 Minimum Inversion Number 线段树和树状数组
题意: 输入一个长度 n 第二行给出长度为n的数组,数组的值刚好为0到n-1这n个数. 然后每次把数组的第一个数放到最后一个,放n-1次,共有n个排列,这n个排列就有n个逆序数,输出这n个逆序数的最小 ...
最新文章
- 360金融携手上海交大共建AI实验室,开启人才战略新布局
- Java类的连接与初始化 (及2013阿里初始化笔试题解析)
- 中国半光漆市场需求前景与投资规划研究报告2021年版
- 209. Minimum Size Subarray Sum 长度最小的子数组
- python 通登录银行_Python3 适合初学者学习的银行账户登录系统实例
- 第二十五期:知乎用Go替代Python,说明了啥
- WinForm控件之【LinkLabel】
- python合法的变量名有哪些_Python判断变量名是否合法的方法示例
- 启动Eclipse 报错:java was started but returned exit
- si4463的寄存器使用说明
- 英语介绍嵌入式计算机,计算机专业的英文自我介绍
- mysql的默认隔离等级_mysql 四种隔离级别
- 标准成本和实际成本的比较
- 语音信号处理--基音检测实验
- 基于人本理念的绩效管理体系设计(一)
- 电泵井php和psi,电泵井测压安全技术.doc
- 2007年最杰出十大新锐站长评选-------关注!
- 以面试官的角度来看 React 工作面试
- Java连接Access 2013
- 小学计算机游戏,小学作文:玩电脑游戏
热门文章
- 如何做一个让开发人员看得起的软件测试人员
- [转] 谈谈MIXI的开源SNS架构
- Mac Unable to save settings: Failed to save settings. Please restart IntelliJ IDEA
- 浅谈Spark几种不同的任务提交相关脚本(以Spark 1.5.0为例)
- 浅谈Eclipse dropins插件安装的坑(附m2e的各个版本插件下载)
- 小型电商Web架构!小而美!值得学习!
- 免费自学编程的12个网站
- 看了Google大神Jeff Dean的传说后,我跪了!这才是真的大神
- 阿里巴巴中台技术架构实践与思考
- 微服务架构实战(一):微服务架构的优势与不足