HDU 1394 Minimum Inversion Number (线段树 单点更新 求逆序数)
题目链接: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 (线段树 单点更新 求逆序数)的更多相关文章
- HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)
HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...
- hdu 1394 Minimum Inversion Number (裸树状数组 求逆序数 && 归并排序求逆序数)
题目链接 题意: 给一个n个数的序列a1, a2, ..., an ,这些数的范围是0-n-1, 可以把前面m个数移动到后面去,形成新序列:a1, a2, ..., an-1, an (where m ...
- hdu 1394 Minimum Inversion Number (树状数组求逆序对)
The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that ...
- hdu - 1394 Minimum Inversion Number(线段树水题)
http://acm.hdu.edu.cn/showproblem.php?pid=1394 很基础的线段树. 先查询在更新,如果后面的数比前面的数小肯定会查询到前面已经更新过的值,这时候返回的sum ...
- [HDU] 1394 Minimum Inversion Number [线段树求逆序数]
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- HDU 1394 Minimum Inversion Number 线段树
题目: http://acm.hdu.edu.cn/showproblem.php?pid=1394 没看到多组输入,WA了一万次...... 其实很简单,有人暴力过得,我感觉归并排序.二叉排序树求逆 ...
- HDU 1394 Minimum Inversion Number(线段树 或 树状数组)
题目大意:给出从 0 到 n-1 的整数序列,A0,A1,A2...An-1.可将该序列的前m( 0 <= m < n )个数移到后面去,组成其他的序列,例如当 m=2 时,得到序列 A2 ...
- HDU 1754 I Hate It 线段树单点更新求最大值
题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...
- HDU 1394 Minimum Inversion Number (树状数组)
题目链接 Problem Description The inversion number of a given number sequence a1, a2, ..., an is the numb ...
随机推荐
- Android移动view动画问题
http://www.cnblogs.com/eoiioe/archive/2012/08/29/2662546.html Android写动画效果不是一般的麻烦,网上找了好久,终于解决了动画的问题, ...
- SpringMVC日期类型转换问题三大处理方法归纳
方法一:实体类中加日期格式化注解 @DateTimeFormat(pattern = "yyyy-MM-dd") private Date receiveAppTime; 方法二: ...
- OGR – Merging Multiple SHP files
So I have 25 shapefiles with data for 25 counties, and I want to merge them all into one shapefile. ...
- paip.按键替换映射总结
paip.按键替换映射总结 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/attilax 因为 ...
- WinForm - ListView点击空白事件
有时看似很小的一个问题却可能困扰我们许久,比如ListView这个问题,其Click事件只是在有选中项的时候才触发,点击其空白处(无选中项)是不会触发Click事件的,找了许久才终于找到解决这个问题的 ...
- SMTP命令 发送邮件 DOS命令
1.实例:从qq邮箱 发送到其他地址的邮箱 >telnet smtp.qq.com 25 >helo qq.com >auth login >NzI3MTU0MTg3QHFxL ...
- 用WebCollector制作一个爬取《知乎》并进行问题精准抽取的爬虫(JAVA)
简单介绍: WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API.仅仅需少量代码就可以实现一个功能强大的爬虫. 怎样将WebCollector导入项目请 ...
- Swift - 初始化方法返回nil表示初始化失败
自Swift1.1开始,初始化init方法便有返回nil的能力.我们可以在init声明的时候在其后面加上一个 ? 或者 ! 来表示初始化失败时可能返回nil. 比如,给Int类添加一个将字符串初始化成 ...
- android https通过载入pfx证书获取数据
直接给代码吧.研究了几天才搞定...... public static final String CLIENT_KET_PASSWORD = "Ku6OpqKDfN4=305790" ...
- hdu 1760 一道搜索博弈题 挺新颖的题目
A New Tetris Game Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...