http://acm.hdu.edu.cn/showproblem.php?pid=1394

Minimum Inversion Number

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

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
#include<stdio.h>
#define maxn 500004
struct node
{
int left,right;
int sum;
};
int val[maxn];
int n;
node tree[*maxn];
void build(int left,int right,int i)
{
tree[i].left =left;
tree[i].right =right;
tree[i].sum =;
if(tree[i].left ==tree[i].right )
return ;
build(left,(left+right)/,*i);
build((left+right)/+,right,*i+);
}
void update(int r,int j)
{
tree[r].sum++;
if(tree[r].left==tree[r].right)
return ;
int mid=(tree[r].left +tree[r].right )/;
if(j<=mid)
update(r*,j);
if(j>mid)
update(r*+,j);
}
int getsum(int p, int left, int right)
{
if (left > right)
return ;
if (tree[p].left == left && tree[p].right == right)
return tree[p].sum;
int m = (tree[p].left + tree[p].right) / ;
if (right <= m)
return getsum(p*, left, right);
else if (left > m)
return getsum(p*+, left, right);
else return getsum(p*, left, m) + getsum(p*+, m + , right);
}
int main()
{
while (~scanf("%d",&n))
{
build(,n - ,);
int i,sum =,ans;
for (i = ;i<= n; i++)
{
scanf("%d", &val[i]);
sum += getsum(, val[i], n - );
update(, val[i]);
}
ans = sum;
for (i = ; i <= n; i++)
{
sum = sum + (n - val[i] - ) - val[i];
ans = sum < ans ? sum : ans;
}
printf("%d\n", ans);
}
return ;
}
 

最新文章

  1. RDIFramework.NET ━ .NET快速信息化系统开发框架 记录所有操作的Sql
  2. 发现IE7的一个问题,不能用索引取字符串中的单个字符
  3. API测试-Super Test
  4. Mac 下安装tomcat
  5. jquery绑定回车键发送(登录)
  6. 卷积神经网络(CNN)
  7. 【HDU3247】 Resource Archiver(DP+AC自动机+最短路)
  8. DataTables DOM定位
  9. [置顶] VB6基本数据库应用(三):连接数据库与SQL语句的Select语句初步
  10. hdu 5469 Antonidas(树的分治+字符串hashOR搜索+剪枝)
  11. apache:侧重于http server tomcat:侧重于servlet引擎
  12. [THUWC 2017]在美妙的数学王国中畅游
  13. hdu 4568 Hunter 最短路+dp
  14. 求剁手的分享,如何简单开发js图表
  15. C# 操作docx文档
  16. 使用Linq查找重复
  17. Btrace 拦截构造函数,同名函数
  18. selenium处理alert弹出框
  19. solr安装配置(一)
  20. tms web core 通过URL 传递参数

热门文章

  1. Cell的重用机制
  2. 06_WebService与Socket的区别
  3. 04_天气查询_JAX-WS方式_服务端
  4. 01_JavaMail_04_带附件邮件的发送
  5. poj2104:K-th Number
  6. SQL的经典操作——批量复制同行的其它列数据到其它列数据
  7. Win7下Boost库的安装
  8. 关于Linux内核学习的误区以及相关书籍介绍
  9. 防止apche列出目录以及下载文件
  10. TDirectory.IsRelativePath是否相对路径