hdu 2689 Sort it (樹狀陣列應用型別三) 【逆序數問題】
阿新 • • 發佈:2019-01-11
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.
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
|
題意:給定一組數,交換相鄰的兩個數,使最後的序列為升序序列,求交換次數。
PS:關於樹狀陣列求逆序的思想我還是推薦一篇部落格吧,自己也是勉強理解 https://www.cnblogs.com/xiongmao-cpp/p/5043340.html
程式碼:
#include<cstdio> #include<cstring> using namespace std; const int N=1008; int c[N]; /*int lowbit(int x) { return (x&(-x)); }*/ void add(int x,int y) { for(;x<=N;x+=(x&(-x))) { c[x]+=y; } } int sum(int x) { int ans=0; for(;x;x-=(x&(-x))) { ans+=c[x]; } return ans; } int main() { int n; while(scanf("%d",&n)!=EOF) { int ans=0; memset(c,0,sizeof(c)); for(int i=1;i<=n;i++) { int x; scanf("%d",&x); add(x,1); ans+=i-sum(x); } printf("%d\n",ans); } return 0; }