Minimum Inversion Number

【题目链接】Minimum Inversion Number

【题目类型】最小逆序数 线段树

&题意:

求一个数列经过n次变换得到的数列其中的最小逆序数

&题解:

先说一下逆序数的概念:

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那末它们就称为一个逆序。

一个排列中逆序的总数就称为这个排列的逆序数。逆序数为偶数的排列称为偶排列;逆序数为奇数的排列称为奇排列。

如2431中,21,43,41,31是逆序,逆序数是4,为偶排列。

换一种说法:

逆序对:数列a[1],a[2],a[3]…中的任意两个数a[i],a[j] (i<j),如果a[i]>a[j],那么我们就说这两个数构成了一个逆序对

逆序数:一个数列中逆序对的总数

如数列 3 5 4 8 2 6 9

(5,4)是一个逆序对,同样还有(3,2),(5,2),(4,2)等等

如何求解?

用树状数组或线段树

还是以刚才的序列

3 5 4 8 2 6 9

大体思路为:新建一个数组,将数组中每个元素置0

0 0 0 0 0 0 0

取数列中最大的元素,将该元素所在位置置1

0 0 0 0 0 0 1

统计该位置前放置元素的个数,为0

接着放第二大元素8,将第四个位置置1

0 0 0 1 0 0 1

统计该位置前放置元素的个数,为0

继续放第三大元素6,将第六个位置置1

0 0 0 1 0 1 1

统计该位置前放置元素的个数,为1

这样直到把最小元素放完,累加每次放元素是该元素前边已放元素的个数,这样就算出总的逆序数来了

在统计和计算每次放某个元素时,该元素前边已放元素的个数时如果一个一个地数,那么一趟复杂度为O(n),总共操作n趟,复杂度为O(n^2),和第一种方法的复杂度一样了,那我们为什么还用这么复杂的方法

当然,在每次统计的过程中用树状数组可以把每一趟计数个数的复杂度降为O(logn),这样整个复杂度就变为O(nlogn)

最后再根据已知的逆序数弄出公式 就可以\(O(n)\)的复杂度取最小值就好了

【时间复杂度】\(O(nlogn)\)

&代码:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; #define lsn b,m,rt<<1
#define rsn m+1,e,rt<<1|1 const int maxn=200000+9;
int seg[maxn<<2];
int a[maxn],x[maxn];
int n;
void PushUp(int rt)
{
seg[rt]=seg[rt<<1]+seg[rt<<1|1];
}
void Update(int id,int xx,int b,int e,int rt)
{
if (b==e){
seg[rt]+=xx;
return ;
}
int m=b+e>>1;
if (id<=m)
Update(id,xx,lsn);
else
Update(id,xx,rsn);
PushUp(rt);
}
int Query(int l,int r,int b,int e,int rt)
{
if (l<=b&&e<=r){
return seg[rt];
}
int m=b+e>>1;
int ans=0;
if (l<=m)
ans+=Query(l,r,lsn);
if (m<r)
ans+=Query(l,r,rsn);
return ans;
}
int main()
{
while(~scanf("%d",&n)){
memset(seg,0,sizeof(seg));
memset(x,0,sizeof(x));
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=n-1;i>=0;i--){
x[i]=Query(0,a[i],0,n-1,1);
Update(a[i],1,0,n-1,1);
}
int sum=0;
for(int i=0;i<n;i++){
// printf("%d\n",x[i]);
sum+=x[i];
}
int re=sum;
// printf("sum=%d\n",sum);
for(int i=0;i<n;i++){
sum=sum+n-1-2*a[i];
re=min(re,sum);
// printf("sum=%d\n",sum);
}
printf("%d\n",re);
}
return 0;
}

HDU 1394 Minimum Inversion Number(最小逆序数 线段树)的更多相关文章

  1. HDU 1394.Minimum Inversion Number-最小逆序数-完全版线段树(单点增减、区间求和)

    HDU1394.Minimum Inversion Number 这个题求最小逆序数,先建一个空的树,然后每输入一个值,就先查询一下,查询之后,更新线段树,然后遍历一遍,每次将第一个数放到最后之后,减 ...

  2. hdu1394 Minimum Inversion Number(最小逆序数)

    Minimum Inversion Number Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/O ...

  3. HDU 1394 Minimum Inversion Number(线段树求最小逆序数对)

    HDU 1394 Minimum Inversion Number(线段树求最小逆序数对) ACM 题目地址:HDU 1394 Minimum Inversion Number 题意:  给一个序列由 ...

  4. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  5. HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number                         ...

  6. HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)

    题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS     Memory Limit: 32768 K Description The inve ...

  7. hdu 1394 Minimum Inversion Number 逆序数/树状数组

    Minimum Inversion Number Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showprob ...

  8. HDU 1394 Minimum Inversion Number(线段树/树状数组求逆序数)

    Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java ...

  9. hdu 1394 Minimum Inversion Number(逆序数对) : 树状数组 O(nlogn)

    http://acm.hdu.edu.cn/showproblem.php?pid=1394  //hdu 题目   Problem Description The inversion number ...

随机推荐

  1. MAC下如何显示隐藏文件

    1.在终端上输入以下命令 defaults write com.apple.finder AppleShowAllFiles -bool true 2.重新启动Finder Command + Opt ...

  2. Java语言概要

    Java把源代码(SourceCode)翻译成字节码(ByteCode):javac MyClass.java,再在Java虚拟机(JVM)上执行字节码:java MyClass. Java是基于面向 ...

  3. 2016年5月面试题(Unity&iOS)

    NGUI的DrawCall drawcall定义:对底层图形程序(比如:OpenGL ES)接口的调用,以在屏幕上画出东西. List在内存中连续的空间保存 List是线性直接存储类型 mipMap是 ...

  4. Flex 利用Space控制进行组件的右对齐

    Spacer 控件可帮助您布置父容器中的子项.虽然 Spacer 控件不会绘制任何内容,但它会在父容器中为其本身分配空间. 在以下示例中,使用灵活的 Spacer 控件将 Button 控件推到右侧, ...

  5. Joomla及其类似软件的说明分析

    Joomla不单单是一款免费的软件,还是在国外相当知名的及内容管理.web开发及手机应用开发等为一体的一套系统.Joomla是使用PHP语言加上MySQL数据库所开发的软件系统,可以在Linux. W ...

  6. UNITY5以后怎么改GUI文字

    提要:以前是UNITY4,后来用了新的UI,于是GUIText这种东西就没有了,研究了很久.... ---------------------------- 这里我想拖个GUI文字框显示FPS,于是代 ...

  7. python 实现文件下载

    Requests库,高度封装的http库 import requests url = 'http://down.sandai.net/thunder9/Thunder9.0.18.448.exe' f ...

  8. linux bond配置步骤,七种bond模式说明

    一.网卡绑定: 第一步:创建一个ifcfg-bondX # vi /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 BONDING_OPT ...

  9. java 自动登录代码

    javaBean的代码    package bean;    import java.io.Serializable;    public class Admin implements Serial ...

  10. (译) Conditional Variational Autoencoders 条件式变换自编码机

    Conditional Variational Autoencoders --- 条件式变换自编码机 Goal of a Variational Autoencoder: 一个 VAE(variati ...