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. tableView的高度问题

    新建tableView 到一个普通的视图控制器的View 下,如果大小是全屏高 ,你的数据最下面显示不全,需要在设置高度时候,用屏幕高度-65 即可

  2. iOS8: Ignore manifest download, already have bundleID

    在企业分发的app下载过程中,iOS8发现挂在官网上的企业版的app点击了提示是否安装应用程序,但始终安装不上程序,的device console发现安装的时候出现 LoadExternalDownl ...

  3. session在.ashx文件操作问题

    在.ashx一般处理文件中如果session没有继承System.Web.SessionState.IRequiresSessionState那么session只有读的权限,没有写的权限; sessi ...

  4. 10 条有趣的 Linux 命令

    在终端工作是一件很有趣的事情.今天,我们将会列举一些有趣得为你带来欢笑的Linux命令. 1. rev 创建一个文件,在文件里面输入几个单词,rev命令会将你写的东西反转输出到控制台. # rev & ...

  5. Android 学习第17课,使用文件的数据存储(4种存储模式)

    Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中.可以使用Context ...

  6. WIN32服务程序(二):卸载服务

    卸载服务的过程是这样的,用OpenSCManager打开SCM,使用OpenService打开准备卸载的服务,通过QueryServiceStatus查询该服务的状态是否停止,如果否,则先停止该服务C ...

  7. gdb调试方法

    先打开 gdb 的调试选项: -g 串口端: ./gdb-server    10.12.2.100:12345  ./Kylin 服务器端: (1)./gdb    ./Kylin (2) targ ...

  8. 使用 itext、flying-saucer 实现html转PDF(转)

    转自 http://blog.csdn.net/mhouwei62/article/details/51394804 表示感谢 itext-2.1.7高于此版本已经更新为AGPL授权,不建议使用. 添 ...

  9. 动手动脑:Finally

    Ø当有多个嵌套的try…catch…finally时,要特别注意finally的执行时机. Ø请先阅读 EmbedFinally.java示例,再运行它,观察其输出并进行总结. Ø特别注意: Ø当有多 ...

  10. visual studio 2013 已停止运行 解决办法

    情况是这样,WINDOWS 8.1,双显卡笔记本,打开VS.NET 没几秒就提示 已停止运行,然后就关闭程序了,找了无数资料都没有解决 -------------------------------- ...