首页 > 代码库 > HDU 2689Sort it 树状数组 逆序对
HDU 2689Sort it 树状数组 逆序对
Sort it
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4110 Accepted Submission(s): 2920
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.
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
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2689
题意:交换相邻的两个数,使得序列是上升的。问需要交换多少次。
题意:交换相邻的两个数,使得序列是上升的。问需要交换多少次。
思路:求出每个数ai前面有多少个数比ai大,或者每个数ai后面有多少个数比ai小。第一种方法只需要交换树状数组更新和求和的函数。第二种方法就是求逆向对的数量和只需要逆向输入a,直接标准的树状数组。
代码:求左边大于等于 a[i]的数的个 数
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int MAXN=1100;int c[MAXN];inline int Lowbit(int x){ return x&(-x);}void update(int i,int val){ for(i; i>0; i-=Lowbit(i)) c[i]+=val;}int sum(int i){ int temp=0; for(i; i<=MAXN; i+=Lowbit(i)) temp+=c[i]; return temp;}int main(){ int i,n; int a; while(~scanf("%d",&n)) { int ans=0; memset(c,0,sizeof(c)); for(i=1; i<=n; i++) { scanf("%d",&a); ans+=sum(a); update(a,1); } cout<<ans<<endl; } return 0;}
HDU 2689Sort it 树状数组 逆序对
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。