hdu1394Minimum Inversion Number
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.
1 3 6 9 0 8 5 7 4 2
#include<stdio.h>
#include<string.h>
#define maxn 5005
int a[maxn];
struct node
{
int l,r,sum;
}b[4*maxn];
void build(int l,int r,int i)
{
int mid;
b[i].l=l;
b[i].r=r;
b[i].sum=0;
if(l==r)
return;
mid=(l+r)/2;
build(l,mid,i*2);
build(mid+1,r,i*2+1);
} int inverse(int l,int r,int i)
{
int mid;
if(b[i].l==l && b[i].r==r)
{
return b[i].sum;
}
mid=(b[i].l+b[i].r)/2;
if(l>mid)
return inverse(l,r,i*2+1);
else if(r<=mid)
return inverse(l,r,i*2);
else if(r>mid && l<=mid)
return inverse(l,mid,i*2)+inverse(mid+1,r,i*2+1);
} void change(int i,int id)
{
int mid;
if(b[i].l==id && b[i].r==id)
{
b[i].sum=1;
return;
}
mid=(b[i].l+b[i].r)/2;
if(id<=mid)
change(i*2,id);
else if(id>mid)
change(i*2+1,id);
b[i].sum=b[i*2].sum+b[i*2+1].sum;
} int main()
{
int n,m,i,j,ans,min;
while(scanf("%d",&n)!=EOF)
{
build(1,n,1);
ans=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
ans=ans+inverse(a[i]+1,n,1);
change(1,a[i]);
}
min=ans;
for(i=1;i<=n;i++)
{
ans=ans+n-2*a[i]-1;
if(ans<min)
min=ans;
}
printf("%d\n",min);
}
}
hdu1394Minimum Inversion Number的更多相关文章
- HDU1394-Minimum Inversion Number
http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number Time Limit: 2000/1000 MS (Ja ...
- hdu1394--Minimum Inversion Number(线段树求逆序数,纯为练习)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- hdu1394Minimum Inversion Number(线段树,求最小逆序数)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- 线段树---HDU1394Minimum Inversion Number
此题和上题略有不同,但是大体差不多,不过要把题意转换过来,题目大体意思为, 输入n, 也就是n个数,这些数为0 - (n-1), 这些数刚开始给定输入的顺序, 然后求他的逆序数,然后接着把第一个移到这 ...
- C++-HDU1394-Minimum Inversion Number[数据结构][树状数组]
给出0~n-1的一个排列,可以整体移动,求逆序对最小值 把数字num[i]的加入,等价于树状数组的第n-num[i]位加1 因为num[i]是第 (n-1)-num[i]+1=n-num[i]大的数字 ...
- HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number ...
- HDU 1394 Minimum Inversion Number(最小逆序数 线段树)
Minimum Inversion Number [题目链接]Minimum Inversion Number [题目类型]最小逆序数 线段树 &题意: 求一个数列经过n次变换得到的数列其中的 ...
- HDU 1394 Minimum Inversion Number(最小逆序数/暴力 线段树 树状数组 归并排序)
题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS Memory Limit: 32768 K Description The inve ...
- ACM Minimum Inversion Number 解题报告 -线段树
C - Minimum Inversion Number Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d &a ...
随机推荐
- 【Java基础】Java9 新特性
Java9 新特性 模块化系统 Java 和相关生态在不断丰富的同时也越来越暴露出一些问题: Java 运行环境的膨胀和臃肿.每次 JVM 启动的时候,至少会 30-60MB 的内存加载,主要原因是 ...
- LeetCode561 数组拆分 I
给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大. 示例 ...
- 阿里云OSS整合
一.对象存储OSS 为了解决海量数据存储与弹性扩容(主要是静态文件的存储例如图片,语音,视频等),项目中我们通常采用云存储的解决方案- 阿里云OSS. 1.开通"对象存储OSS"服 ...
- Linux面试必备
1.Linux的体系结构
- IPC图像处理项目流程图
网络摄像机IPC图像处理项目流程图:
- python(paramiko模块的简单使用)
#通过paramiko模块连接主机运行bash命令 import paramiko hostname = '192.168.88.31' port = 22 username = 'root' pas ...
- mybatis框架整合及逆向工程
mybatis框架整合及逆向工程 一.三大框架整合 整合SSM框架 1.导入pom文件 1.导入spring的pom依赖 <?xml version="1.0" enco ...
- Web自动化测试python环境中安装 --selenium安装、火狐和火狐驱动版本、谷歌和谷歌驱动版本、测试
一.安装selenium Windows命令行(cmd)输入pip install selenium(无须指定版本默认最新)或 pip install selenium==3.141.0(可指定版本) ...
- 研发过程及工具支撑 DevOps 工具链集成
https://mp.weixin.qq.com/s/NYm63nkCymIV3DbL4O01dg 腾讯重新定义敏捷 |Q推荐 小智 InfoQ 2020-09-03 敏捷开发奠基人 Robert C ...
- 入 Go 必读:大型Go工程的项目结构及实战思考 原创 毛剑 QCon 今天
入 Go 必读:大型Go工程的项目结构及实战思考 原创 毛剑 QCon 今天