1394 ( Minimum Inversion Number ) (线段树)
来源:互联网 发布:淘宝程序代写 编辑:程序博客网 时间:2024/05/08 02:18
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): 16259 Accepted Submission(s): 9891
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
#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <map>#include <set>#include <stack>#include <string>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define LL long longusing namespace std;const int SIZE=5e3+10;const int maxn=500000;const int Mod=1e8;int sum[SIZE<<2];int a[SIZE];void pushup(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt){ memset(sum,0,sizeof(sum));}void update(int x,int l,int r,int rt){ if(l==r){ sum[rt]=1; return; } int m=(l+r)>>1; if(x<=m)update(x,lson); else update(x,rson); pushup(rt);}int query(int x,int l,int r,int rt){ if(x<=l){ return sum[rt]; } int m=(l+r)>>1; int cnt=0; if(x<m)cnt+=query(x,lson)+query(m+1,rson); else cnt+=query(x,rson); return cnt;}int main(){ int n; while(scanf("%d",&n)!=EOF){ int sum=0; build(0,n-1,1); for(int i=0;i<n;i++){ scanf("%d",&a[i]); sum+=query(a[i],0,n-1,1); update(a[i],0,n-1,1); } int ans=sum; for(int i=0;i<n;i++){ sum+=n-1-2*a[i]; ans=min(ans,sum); } printf("%d\n",ans); } return 0;}
0 0
- HDU 1394 Minimum Inversion Number 线段树
- HDU 1394 Minimum Inversion Number 线段树
- HDU-1394 Minimum Inversion Number(线段树)
- 【线段树】hdu 1394 Minimum Inversion Number
- 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 线段树
- [线段树] HDU 1394 - Minimum Inversion Number
- hdu 1394 Minimum Inversion Number 线段树
- hdu 1394 Minimum Inversion Number 线段树
- 1394 ( Minimum Inversion Number ) (线段树)
- hdu 1394 Minimum Inversion Number(线段树)
- HDU 1394 Minimum Inversion Number (线段树)
- HDU 1394 Minimum Inversion Number 线段树
- PID连续控制算法的表达式以及C语言实现
- iOS conformsToProtocol
- Java 多线程 synchronized关键字详解
- android 图片轮播控件 Android-ConvenientBanner简单使用
- Android--短信拦截及IP拨号
- 1394 ( Minimum Inversion Number ) (线段树)
- NodeJs操作mysql数据库(js版)
- java中5种常见的异常(Exception)
- 学习编程小技巧
- 两分钟彻底让你明白Android Activity生命周期(图文)!
- USETC 1060 秋实大哥与快餐店
- Microsoft Unit Test
- AB棋
- centos 7.0下关闭&启动防火墙