HDU 2689 Sort it 树状数组

来源:互联网 发布:高德导航软件 编辑:程序博客网 时间:2024/06/07 07:45


Sort it

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4740    Accepted Submission(s): 3297


Problem Description
You want to processe a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. Then how many times it need.
For example, 1 2 3 5 4, we only need one operation : swap 5 and 4.
 

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 <= 1000); the next line contains a permutation of the n integers from 1 to n.
 

Output
For each case, output the minimum times need to sort it in ascending order on a single line.
 

Sample Input
31 2 34 4 3 2 1
 

Sample Output
06
 

Author
WhereIsHeroFrom
 

Source
ZJFC 2009-3 Programming Contest
 

Recommend
yifenfei   |   We have carefully selected several similar problems for you:  1892 2688 3584 2492 2227 
 



在这里简单说一下,这里也是利用下标的那个思想,这个数出现过赋值为1,就那个意思,自己理解下,和普通相比的区别就是这个求前面有多少个数省事
ac代码:
#include <stdio.h> #include <cmath>#include <cstring>#include <queue>#include <algorithm>#define ll long long using namespace std;const int maxn=1e6+5;int n;int tree[maxn];int a;void add(int k,int num){while(k<maxn){tree[k]+=num;k+=k&-k;}}int read(int k){int sum=0;while(k > 0){sum+=tree[k];k-=k&-k;}return sum;}int main(){while(~scanf("%d",&n)){int ans=0;memset(tree,0,sizeof(tree));for(int i=1;i<=n;i++){scanf("%d",&a);add(a,1);ans+=i-read(a);}printf("%d\n",ans);}return 0;}


 

原创粉丝点击