http://acm.hdu.edu.cn/showproblem.php?pid=2689
Sort it
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2261 Accepted Submission(s): 1628
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
=====================================
看到这道题,说是树状数组,想了一下,八竿子打不到的都可以用树状数组???
然后还是乖乖的去看了题解,才知道……
如果你说,我不懂,怎么也不懂,那就看看这个吧:http://www.cnblogs.com/xiaohongmao/archive/2012/05/28/2520710.html
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <algorithm> int n; int c[1005]; int Lowbit(int x) { return x&(-x); } void Update(int x,int i) { while(x<=n) { c[x]+=i; x+=Lowbit(x); } } int Sum(int x) { int s=0; while(x>0) { s+=c[x]; x-=Lowbit(x); } return s; } int main() { int i,j,m; while(scanf("%d",&n)!=EOF) { memset(c,0,sizeof(c)); int sum=0; for(i=1;i<=n;i++) { scanf("%d",&m); Update(m,1); sum+=(m-Sum(m)); } printf("%d\n",sum); } return 0; }