您的位置:首页 > 其它

hdu 2689 sort it

2017-04-18 14:46 411 查看

Sort it

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

Total Submission(s): 4487    Accepted Submission(s): 3119


[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

哪个数进入序列 就把他置成1 不是第几个输进来把第几个置成1 而是根据他的数值确定位置 所以建立的树状数组是排好序的 。
答案就是每个数前面比她大的个数和 

这个数是i-query(n) i代表是第几个数 n 是这个数的数值。
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int
maxn=1005;
int
lowbit(int i)
{
return
i&(-i);
}
int
a[maxn];
int
n;
int
update(int i,int b)
{
while(
i<=n)
{<
4000
/span>

a[i]+=b;
i+=lowbit(i);
}

}
int
query(int i)
{
int
sum=0;
while(
i>0)
{

sum+=a[i];
i=i-lowbit(i);
}
return
sum;
}
int main()
{

while(
cin>>n)
{
int
ans=0,x;
memset(a,0,sizeof(a));
for(int
i=1;i<=n;i++)
{

scanf("%d",&x);
update(x,1);
ans+=i-query(x);
}

cout<<ans<<endl;
}

return
0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: