HDOJ 1394 Minimum Inversion Number【求逆序数】
来源:互联网 发布:ccdd数据库官网 编辑:程序博客网 时间:2024/06/08 19:01
Minimum Inversion Number
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 18008 Accepted Submission(s): 10945
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.
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
101 3 6 9 0 8 5 7 4 2
Sample Output
16
Author
CHEN, Gaoli
Source
ZOJ Monthly, January 2003
Recommend
Ignatius.L
= =写了这个题我才发现求逆序数的时候不离散化的求法和离散化之后的求法还不太一样!(好烦QAQ)
这个题的大意不是很难理解,就是说给你一个序列,然后求逆序数。求完之后把这个序列第一个数放最后,再求逆序数。如此循环一圈,问这一圈里能得出的最小逆序数是多少?
这个题还有一点需要注意一下,就是把最前面的数放到最后面后怎么求逆序数,一遍一遍的跑肯定是不行的。具体用什么方法,可以直接看代码,然后这里有一份详解(点我!)写得很清楚,看不明白代码可以看这个。
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define N 5000+10int c[N],a[N];int n;int lowbit(int x){return x&(-x);}void add(int x){while(x<=n){c[x]++;x+=lowbit(x);}}int gsum(int x){int s=0;while(x>0){s+=c[x];x-=lowbit(x);}return s;}int main(){int i;while(~scanf("%d",&n)){memset(c,0,sizeof(c));int ans=0;for(i=0;i<n;i++){scanf("%d",&a[i]);a[i]++;ans+=gsum(n)-gsum(a[i]);add(a[i]);}int minn=ans;for(i=0;i<n;i++) { ans+=(n-a[i])-(a[i]-1); if(ans<minn) minn=ans; } printf("%d\n",minn);}return 0;}
0 0
- HDOJ 1394 Minimum Inversion Number【求逆序数】
- hdoj 1394 Minimum Inversion Number【树状数组求逆序数--逆序数的性质】
- HDOJ 题目1394 Minimum Inversion Number(数状数组求逆序对)
- HDOJ 1394 Minimum Inversion Number 求循环串的最小逆序数(暴力&&线段树)
- 【线段树-区间求和求最小逆序数】HDOJ Minimum Inversion Number 1394
- HDOJ 1394 - Minimum Inversion Number 求逆序对+二分查找
- hdoj 1394 Minimum Inversion Number【线段树求逆序对】
- HDOJ 1394 Minimum Inversion Number (逆序数对)
- HDOJ 1394 Minimum Inversion Number(逆序数 + 线段树)
- HDOJ 1394 Minimum Inversion Number(线段树+逆序数)
- HDU1394 Minimum Inversion Number 求逆序数
- HDU 1394 Minimum Inversion Number 线段树求逆序数
- hdu 1394 Minimum Inversion Number 线段树求逆序数
- HDU 1394 Minimum Inversion Number (求逆序数)
- 线段树求逆序数 hdu 1394 Minimum Inversion Number
- HDU 1394 Minimum Inversion Number【线段树求逆序数】
- hdu 1394 Minimum Inversion Number 归并求逆序数
- HDU 1394- Minimum Inversion Number(线段树求逆序数)
- Docker+Selenium Grid构建分布式Web测试环境
- ASP.NET 身份验证机制
- 思维的误区:忽视沉默的大多数
- 华为oj 扑克牌的大小
- oracle表连接------>排序合并连接(Merge Sort Join)
- HDOJ 1394 Minimum Inversion Number【求逆序数】
- 给嵌入式工程师的一封信
- 错误记录二
- DayDayUp周报总目录
- Java学习提要——逻辑运算符与位运算符
- zzuli 1912: 小火山的爱情密码(二分 || 尺取)
- 单例模式(五)
- getRequestDispatcher()与sendRedirect()的区别
- mybatis 项目启动时报“Result Maps collection already contains value forxxx”错误