hdu 13394 Minimum Inversion Number 线段树
题意:
首先给你一个长度为n的序列v,你需要首先找出来逆序对(i<j && v[i]>v[j])
然后把这个序列的最后一个元素放在第一个位置上,其他元素都向后移动一位。
一直这样操作,会得到n个序列,问你这n个序列中,哪个序列中的逆序对数最少,并输出
题解:
首先我们可以通过线段树得到最初哪个序列的逆序对数,其实也可以通过归并排序得到,因为我是练习线段树,所以用的线段树写的
线段树求逆序对数的话,我们可以求出来v[i]可以和v[j]形成的逆序对数,这个j的取值范围为1<=j<i,我们可以维护一个最小值,然后得到有多少j能和v[i]构成逆序对
这一点不懂可以看一下代码
对于其他序列,你会发现就只是把最后一个元素放在第一个位置上,其他元素都向后移动一位。
那么原来上一个序列的逆序对数会减少n-v[n],因为对于v[n]元素,它是最后一个元素,那么肯定v[n]+1,v[n]+2...n都可以和v[n]构成逆序对
逆序对数会增加v[n]-1个,因为v[n]移动到第一个位置之后,那么1,2,3...v[n]-1都可以和v[n]构成一个逆序对数
代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=2e5+10;
const int INF=0x3f3f3f3f;
#define ll long long
#define mem(a) memset(a,0,sizeof(a))
#define mem_(a) memset(a,-1,sizeof(a))
#define mem__(a) memset(a,INF,sizeof(a))
int lazy[maxn<<2],tree[maxn<<2],arr[maxn];
void push_up(int root)
{
tree[root]=min(tree[root<<1],tree[root<<1|1]);
}
void build(int root,int L,int R)
{
if(L==R)
{
tree[root]=arr[L];
return;
}
int mid=(L+R)>>1;
build(root<<1,L,mid);
build(root<<1|1,mid+1,R);
push_up(root);
}
void update(int root,int L,int R,int pos,int val)
{
if(L==R)
{
tree[root]=val;
return;
}
int mid=(L+R)>>1;
if(pos<=mid)
update(root<<1,L,mid,pos,val);
else update(root<<1|1,mid+1,R,pos,val);
push_up(root);
}
int query(int root,int L,int R,int LL,int RR,int val)
{
if(LL<=L && R<=RR)
{
if(tree[root]>val)
{
return R-L+1;
}
if(L==R) return 0;
}
int mid=(L+R)>>1,ans=0;
if(LL<=mid) ans+=query(root<<1,L,mid,LL,RR,val);
if(RR>mid) ans+=query(root<<1|1,mid+1,R,LL,RR,val);
return ans;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int sum=0;
mem__(tree);
//update(1,1,n,1,2);
//printf("%d**\n",query(1,1,n,1,1,1));
for(int i=1;i<=n;++i)
{
//int x;
scanf("%d",&arr[i]);
if(i!=1)
{
sum+=query(1,1,n,1,i-1,arr[i]);
}
update(1,1,n,i,arr[i]);
arr[i]+=1;
}
int minn=sum;
//printf("%d***\n",sum);
for(int i=n;i>1;--i)
{
sum=sum+((arr[i]-1)-(n-arr[i]));
minn=min(sum,minn);
}
printf("%d\n",minn);
}
return 0;
}
hdu 13394 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 [线段树求逆序数]
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 很基础的线段树. 先查询在更新,如果后面的数比前面的数小肯定会查询到前面已经更新过的值,这时候返回的sum ...
- HDU 1394 Minimum Inversion Number(线段树 或 树状数组)
题目大意:给出从 0 到 n-1 的整数序列,A0,A1,A2...An-1.可将该序列的前m( 0 <= m < n )个数移到后面去,组成其他的序列,例如当 m=2 时,得到序列 A2 ...
- HDU 1394 Minimum Inversion Number 线段树
题目: http://acm.hdu.edu.cn/showproblem.php?pid=1394 没看到多组输入,WA了一万次...... 其实很简单,有人暴力过得,我感觉归并排序.二叉排序树求逆 ...
- HDU-1394 Minimum Inversion Number 线段树+逆序对
仍旧在练习线段树中..这道题一开始没有完全理解搞了一上午,感到了自己的shabi.. Minimum Inversion Number Time Limit: 2000/1000 MS (Java/O ...
- hdu1394(Minimum Inversion Number)线段树
明知道是线段树,却写不出来,搞了半天,戳,没办法,最后还是得去看题解(有待于提高啊啊),想做道题还是难啊. 还是先贴题吧 HDU-1394 Minimum Inversion Number Time ...
- HDU 1394 Minimum Inversion Number (树状数组)
题目链接 Problem Description The inversion number of a given number sequence a1, a2, ..., an is the numb ...
- hdu 1394 Minimum Inversion Number (树状数组求逆序对)
The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that ...
随机推荐
- FAT32、NTFS、exFAT有什么区别?
文件系统 我们经常会对电脑硬盘.U盘.移动硬盘进行格式化,而在格式化硬盘的时候会弹出文件系统的选项,分别有FAT32.NTFS.exFAT三种格式,那么FAT32.NTFS.exFAT有什么区别? 在 ...
- 【MySQL】SELECT语句 - 查询数据
第4章 检索数据 文章目录 第4章 检索数据 1.SELECT语句 2.检索单个列 3.检索多个列 4.检索所有列 5.检索不同的行 6.限制结果 7.使用完全限定的表名 8.小结 简单记录 - My ...
- SAP 摘录数据集
要在报表中创建并填充摘录数据集,需要执行三步骤:1.将要在摘录数据集中使用的记录类型定义为字段组FIELD-GROUPS该语句定义了字段组,字段组可以将几个字段组合到一个名称下,字段组不为字段保留存储 ...
- 通过js给某个标签添加内容或者删除标签
添加内容 //先保存div中原来的html var tag = document.getElementById("tag").innerHTML; //构造新的内容 var cou ...
- Maven + springboot + mybatis 构建多模块工程
废话不说先上最终效果:创建一个空项目,再创建一个父项目用来管理各模块并维护各模块关系,简要说明如下: parent模块:主要用来管理以下各模块,和各模块涉及的jar包版本和boot项目入口级的的依赖管 ...
- 将连续增长 N 次字符串所需的内存重分配次数从必定 N 次降低为最多 N 次 二进制安全
SDS 与 C 字符串的区别 - Redis 设计与实现 http://redisbook.com/preview/sds/different_between_sds_and_c_string.htm ...
- 能够满足这样要求的哈希算法有很多,其中比较著名并且应用广泛的一个哈希算法,那就是MurmurHash 算法。尽管这个哈希算法在 2008 年才被发明出来,但现在它已经广泛应用到 Redis、MemCache、Cassandra、HBase、Lucene 等众多著名的软件中。
能够满足这样要求的哈希算法有很多,其中比较著名并且应用广泛的一个哈希算法,那就是MurmurHash 算法.尽管这个哈希算法在 2008 年才被发明出来,但现在它已经广泛应用到 Redis.MemCa ...
- 两个list<Map<String,String>>放入一个list中
// public static void main(String[] args) {// List<Map<String, String>> list2 = new Arra ...
- POJ2029 二维线段树
Get Many Persimmon Trees POJ - 2029 Seiji Hayashi had been a professor of the Nisshinkan Samurai Sch ...
- valgrind和Kcachegrind性能分析工具详解
一.valgrind介绍 valgrind是运行在Linux上的一套基于仿真技术的程序调试和分析工具,用于构建动态分析工具的装备性框架.它包括一个工具集,每个工具执行某种类型的调试.分析或类似的任务, ...