您的位置:首页 > 其它

HDU 2689 Sort it 树状数组

2017-08-03 20:47 295 查看

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

3
1 2 3
4
4 3 2 1

 

Sample Output

0
6

 

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;
}


 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: