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
06
简单的一个水题,第一次看到的时候 直接暴力俩for循环计数下就ac了。
。 但是 后来用了树状数组来写,发现真的很神奇。理解下题意。就是看
输入的时候的数前面有几个逆序数,存入数组,然后 求1到n的逆序数个数。
注意输入的时候是先更新 ,防止最后一个未算入。
暴力写法:
#include<iostream> #include<cstring> #include<cstdlib> #include<string> using namespace std; int main() { int n,i,j; int s[1010]; while(cin>>n) { for(i=0;i<n;i++) { cin>>s[i]; } int tot=0; for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { if(s[i]>s[j]) { int t=s[i]; s[i]=s[j]; s[j]=t; tot++; } } } cout<<tot<<endl; } return 0; }
树状数组写法
#include<iostream> #include<cstring> using namespace std; int s[1010],n; int lowbit(int x) { return x&(-x); } int sum(int x) { int suM=0; while(x>0) { suM+=s[x]; x-=lowbit(x); } return suM; } void updata(int x) { while(x<=n) { ++s[x]; x+=lowbit(x); } } int main() { int i,m; while(cin>>n) { memset(s,0,sizeof(s)); int ans=0; for(i=1;i<=n;i++) { cin>>m; updata(m); ans+=sum(n)-sum(m); } cout<<ans<<endl; } return 0; }