您的位置:首页 > 其它

杭电Sort it 2689树状数组

2015-11-21 13:56 134 查看

Sort it

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 3510 Accepted Submission(s): 2546



[align=left]Problem Description[/align]
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.

[align=left]Input[/align]
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.

[align=left]Output[/align]
For each case, output the minimum times need to sort it in ascending order on a single line.

[align=left]Sample Input[/align]

3
1 2 3
4
4 3 2 1


[align=left]Sample Output[/align]

0
6//虽然是水题,但是对于初学者来说很想通,自己好好推理推理#include <iostream>
#include <cstring>
using namespace std;
const int maxn=1010;
int C[maxn],n;
int lowbit(int x)
{
return x&(-x);
}
void update(int i)
{
while(i<=n)
{
C[i]+=1;
i+=lowbit(i);
}
}
int query(int i)
{
int sum=0;
while(i>0)
{
sum+=C[i];
i-=lowbit(i);
}
return sum;
}
int main()
{
while(cin>>n)
{
int sum=0;
memset(C,0,sizeof(C));
for(int i=1;i<=n;i++)
{
int a;
cin>>a;
update(a);
sum+=i-query(a);//得出比i大的的元素个数,即要交换的次数
}
cout<<sum<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: