HDU 2689 Sort it (树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2689

Sort it

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.

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

(我的代码中   此题与b[i]数组密切相关

b[i]表示

假如给你一个数组a[ ] = {2,5,3,4,1},求b[i],b[i] 表示在a[1],a[2]...a[i-1]中(即位置i的左边)小于等于a[i]的数的个数。)

好像大神们都不是我这样做的, 我有走了奇葩路线  呵呵。。

 1 #include<iostream>
 2
 3 using namespace std ;
 4
 5 int sum[1005];
 6 int n ;
 7
 8 int lowbit(int x) //取x的最低位1,比如4,则返回4,如5,则返回1
 9 {
10     return x&(-x);
11 }
12
13 void update(int i, int val)  //将第i个元素增加val
14 {
15     //i的祖先都要增加val
16     while(i <= n)
17     {
18         sum[i] += val;
19         i += lowbit(i);   //将i的二进制未位补为得到其祖先
20     }
21 }
22
23 int Sum(int i)   //求前i项的和
24 {
25     int s = 0;
26     //将前i项分段
27     while(i > 0)
28     {
29         s += sum[i];
30         i -= lowbit(i);  //去掉i的二进制最后一个
31     }
32     return s;
33 }
34
35 int main()
36 {
37     int i;
38     int a[1005],b[1005];
39     while(scanf("%d",&n)!=EOF)
40     {
41         int count=0;
42         memset(b,0,sizeof(b));
43         memset(sum,0,sizeof(sum));
44         for(i=1;i<=n;i++)
45         {
46             scanf("%d",&a[i]);
47         }
48
49         for(i=1;i<=n; i++)
50         {
51             b[i] = Sum(a[i]); //求前a[i]项的和
52             update(a[i],1);      //第a[i]个元素+1
53             count+=i-b[i]-1;
54         }
55
56
57         cout<<count<<endl;
58
59     }
60
61     return 0;
62 }

HDU 2689 Sort it (树状数组),布布扣,bubuko.com

时间: 2024-10-10 22:59:26

HDU 2689 Sort it (树状数组)的相关文章

HDU 2689 Sort it(树状数组求逆序数)

Sort it Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3418    Accepted Submission(s): 2478 Problem Description You want to processe a sequence of n distinct integers by swapping two adjacent

HDU 3333 Turing Tree 树状数组 离线查询

题意: 给你一个数列,然后有n个查询,问你给定区间中不同数字的和是多少. 思路还是比较难想的,起码对于蒟蒻我来说. 将区间按照先右端点,后左端点从小到大排序之后,对于每个查询,我只要维护每个数字出现的最后一次就可以了(这个结论稍微想一下就可以证明是正确的). 然后就是简单的点更新,区间求和问题了- #include <cstdio> #include <cstring> #include <iostream> #include <map> #include

HDU 1541 Stars (树状数组)

Problem Description Astronomers often examine star maps where stars are represented by points on a plane and each star has Cartesian coordinates. Let the level of a star be an amount of the stars that are not higher and not to the right of the given

HDU 3854 Glorious Array(树状数组)

题意:给一些结点,每个结点是黑色或白色,并有一个权值.定义两个结点之间的距离为两个结点之间结点的最小权值当两个结点异色时,否则距离为无穷大.给出两种操作,一种是将某个结点改变颜色,另一个操作是询问当前距离小于K的结点有多少对,K是一个定值. 思路:先求最初时候小于k的结点有多少对,然后每次改变颜色的时候,统计该点左侧和右侧各有多少同色和异色的结点(这一步使用树状数组),分别处理就行.另外需要预处理离某个结点最近的两个距离小于K的结点的位置. 代码写的略乱. #include<cstdio> #

HDU 2492 Ping pong (树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2492 Ping pong Problem Description N(3<=N<=20000) ping pong players live along a west-east street(consider the street as a line segment). Each player has a unique skill rank. To improve their skill rank

HDU 1541 Stars(树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541 解析: 题意:大概就是计算每颗星星左下边包括了多少颗星星,这个数值就是level.左下边不包括本身,不超过本身的x,y的坐标,可以等于.问每种level有多少颗星星. 这题,一开始想不到怎么用到树状数组,后来看了一下,发现题目给的数据是已经按x,y排好序的,所以我们可以不用管y的值. 注意: 1.每次输入一个坐标对之后,都要计算一下这个它的level. 2.此题的x坐标可以为0,而树状数组是从

HDU 1892 二维树状数组

See you~ Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 3485    Accepted Submission(s): 1103 Problem Description Now I am leaving hust acm. In the past two and half years, I learned so many kno

HDU 5775:Bubble Sort(树状数组)

http://acm.hdu.edu.cn/showproblem.php?pid=5775 Bubble Sort Problem Description P is a permutation of the integers from 1 to N(index starting from 1).Here is the code of Bubble Sort in C++. for(int i=1;i<=N;++i) for(int j=N,t;j>i;—j) if(P[j-1] > P

HDU 5775 Bubble Sort(树状数组)

题目链接:HDU 5775 题面: Bubble Sort Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 709    Accepted Submission(s): 418 Problem Description P is a permutation of the integers from 1 to N(index startin