Minimum Inversion Number

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9342    Accepted Submission(s): 5739

Problem Description
The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that satisfy i < j and ai > aj.

For a given sequence of numbers a1, a2, ..., an, if we move the first m >= 0 numbers to the end of the seqence, we will obtain another sequence. There are totally n such sequences as the following:

a1, a2, ..., an-1, an (where m = 0 - the initial seqence)
a2, a3, ..., an, a1 (where m = 1)
a3, a4, ..., an, a1, a2 (where m = 2)
...
an, a1, a2, ..., an-1 (where m = n-1)

You are asked to write a program to find the minimum inversion number out of the above sequences.

 
Input
The input consists of a number of test cases. Each case consists of two lines: the first line contains a positive integer n (n <= 5000); the next line contains a permutation of the n integers from 0 to n-1.
 
Output
For each case, output the minimum inversion number on a single line.
 
Sample Input
10
1 3 6 9 0 8 5 7 4 2
 
Sample Output
16
 
Author
CHEN, Gaoli
 
Source
 
代码:
 //线段树实现单点更新,并求和
#include<stdio.h>
#define maxn 5001
struct node{
int lef,rig,sum;
int mid(){ return lef+((rig-lef)>>) ;}
};
node seg[maxn<<];
int aa[maxn+];
void build(int left,int right,int p )
{
seg[p].lef=left;
seg[p].rig=right;
seg[p].sum=;
if(left==right) return ;
int mid=seg[p].mid();
build(left,mid,p<<);
build(mid+,right,p<<|);
}
void updata(int pos,int p,int val)
{
if(seg[p].lef==seg[p].rig)
{
seg[p].sum+=val;
return ;
}
int mid=seg[p].mid();
if(pos<=mid) updata(pos,p<<,val);
else updata(pos,p<<|,val);
seg[p].sum=seg[p<<].sum+seg[p<<|].sum;
}
int query(int be ,int en,int p)
{
if(be<=seg[p].lef&&seg[p].rig<=en)
return seg[p].sum;
int mid=seg[p].mid();
int res=;
if(be<=mid) res+=query(be ,en ,p<<);
if(mid<en) res+=query(be ,en ,p<<|);
return res;
}
int main()
{
int nn,i,ans;
while(scanf("%d",&nn)!=EOF)
{
ans=;
build(,nn-,);
for(i=;i<=nn;i++)
{
scanf("%d",&aa[i]);
updata(aa[i],,);
if(aa[i]!=nn-) ans+=query(aa[i]+,nn-,); //统计比其大的数
}
int min=ans;
for(i=;i<=nn;i++)
{
ans+=nn-*aa[i]-;
if(min>ans) min=ans;
}
printf("%d\n",min);
}
return ;
}
 

HDUOJ---1754 Minimum Inversion Number (单点更新之求逆序数)的更多相关文章

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

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

  2. HDU - 1394 Minimum Inversion Number (线段树求逆序数)

    Description The inversion number of a given number sequence a1, a2, ..., an is the number of pairs ( ...

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

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

  4. Minimum Inversion Number(线段树求逆序数)

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

  5. hdu1394 Minimum Inversion Number (线段树求逆序数&&思维)

    题目传送门 Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  6. hdu 1394 Minimum Inversion Number 【线段树求逆序数】

    之前写过树状数组的,再用线段树写一下--- #include<cstdio> #include<cstring> #include<iostream> #inclu ...

  7. HDU - 1394 Minimum Inversion Number(线段树求逆序数---点修改)

    题意:给定一个序列,求分别将前m个数移到序列最后所得到的序列中,最小的逆序数. 分析:m范围为1~n,可得n个序列,求n个序列中最小的逆序数. 1.将序列从头到尾扫一遍,用query求每个数字之前有多 ...

  8. hdu1394--Minimum Inversion Number(线段树求逆序数,纯为练习)

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

  9. <Sicily>Inversion Number(线段树求逆序数)

    一.题目描述 There is a permutation P with n integers from 1 to n. You have to calculate its inversion num ...

随机推荐

  1. Eclipse点不出方法了

    window→preferences→java→editor→Content Assist→Advanced 然后选中右上方的所有 右下方选中一个即可.

  2. JS 中div内容的显示和隐藏

    1. document.getElementById("dialog-auclot-status").style.display="none";//页面加载时隐 ...

  3. SystemVerilog Event Scheduling Algorithm

    While simulating System Verilog design and its test-bench including assertions, events has to be dyn ...

  4. struts2 18拦截器详解(五)

    I18nInterceptor 该拦截器处理defaultStack第四的位置,是用来方便国际化的,如果说我们的一个Web项目要支持国际化的话,通常的做法是给定一个下拉框列出所支持的语言,当用户选择了 ...

  5. Android之SlideMenu实例Demo

    年末加班基本上一周都没什么时候回家写代码,回到家就想睡觉,周末难得有时间写个博客,上次写了一篇关于SlideMenu开源项目的导入问题,这次主要讲讲使用的问题,SlideMenu应用的广泛程度就不用说 ...

  6. 科幻大片中那些牛X代码真相

    在<黑客帝国>中,救世主Neo的队友通过屏幕上"1"和"0"构成的数据流,就能看到鲜活的画面,这应该算是科幻大片中对代码最极致的表现了.其他科幻电影 ...

  7. Cognos让指定用户不具有删除内容的权限

    为了方便用户使用Cognos,现在很多对权限要求不够严格的用户就想到了可以让用户实现匿名登陆,即不登陆系统即可实现访问报表,当然这也仅仅是按照客户的需求,我个人认为一个安全性的数据平台还是需要对登陆. ...

  8. 如何为Android上的产品设计一款合适的图标

    如 果你已经完成了你的app,你一定会马上向其它人宣布这件事情.但是你需要注意一个很重要的问题,那就是app的图标.你的图标可能在项目启动之 前就已经设计好了,但我不喜欢这样,如果app没有完成实际上 ...

  9. ListView与Button共存问题

        转载:http://blog.csdn.net/xinqiqi123/article/details/6458030 ListView 和 其它能触发点击事件的widget无法一起正常工作的原 ...

  10. Activiti Designer 5.14.1插件安装和使用

    1.离线包下载 离线安装包下载:https://files.cnblogs.com/files/modou/Activiti_BPMN_2.0_designer.rar 2.安装 先把jars文件夹中 ...