`
暴风雪
  • 浏览: 390631 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

[树状数组]poj 2299

 
阅读更多

题意

      求一列数字的逆序数。

 

思路

      由于数字很大,所以不能直接求,这里先对原数列排序之后,求出原下标的逆序数即可

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define lowbit(x) (x&(-x))
using namespace std;
const int nMax = 500010;
typedef long long ll;

struct rrr{
    ll a,b;
}num[nMax];

bool cmp(rrr a, rrr b){
    if(a.a<b.a)return 1;
    return 0;
}
int n, arr[nMax];

void add(int loc, int val){
    while(loc <= n){
        arr[loc] += val;
        loc += lowbit(loc);
    }
}

int sum(int loc){
    int res = 0;
    while(loc >= 1){
        res += arr[loc];
        loc -= lowbit(loc);
    }
    return res;
}

int main(){
    int i;
    while(scanf("%d",&n)!=EOF&&n){
        for(i = 1; i <= n; i ++){
            scanf("%I64d",&num[i].a);
            num[i].b = i;
        }
        sort(num + 1, num + n + 1 ,cmp);
        memset(arr, 0,sizeof(arr));
        ll res = 0;
        for(i = 1; i <= n; i++){
            res += num[i].b - 1 - sum(num[i].b);
//            cout<<num[i].b<<" "<<sum(num[i].b)<<endl;
            add(num[i].b, 1);
        }
        printf("%I64d\n",res);
    }
    return 0;
}

 

0
0
分享到:
评论

相关推荐

    树状数组练习:POJ 3067

    【标题】"树状数组练习:POJ 3067" 树状数组,也称为线段树(Segment Tree),是一种高效的数据结构,用于处理区间查询和修改问题。在这个问题中,我们通过分析POJ 3067的题目来探讨如何应用树状数组解决实际问题。...

    树状数组练习:POJ 2481(JAVA)

    【标题】"树状数组练习:POJ 2481(JAVA)" 是一篇关于使用树状数组(也称为线段树)解决编程竞赛问题的文章。这篇文章可能详细讲解了如何运用这种数据结构来解决特定的问题POJ 2481。POJ(Programming Online Judge)...

    图的深搜+树状数组练习 POJ 3321(JAVA)

    标题中的“图的深搜+树状数组练习 POJ 3321(JAVA)”指的是一个编程题目,其中涉及到图的深度优先搜索(DFS, Depth First Search)算法和树状数组(也称为线段树,Segment Tree)的数据结构。这个题目来源于POJ...

    二维树状数组练习 POJ 2029

    它扩展了一维树状数组(也称作线段树),能够处理二维或多维的数组更新和查询操作。在POJ 2029这个题目中,我们可能面临的问题是需要对一个二维矩阵进行动态更新和求和查询,例如计算某一个矩形区域内的元素总和。 ...

    二维树状数组学习之二:练习POJ 1195

    在本篇中,我们将深入学习二维树状数组的应用,并通过解决POJ 1195问题来实践这一概念。 POJ 1195题目要求我们计算一个二维矩阵中的子矩阵之和。这正是二维树状数组的优势所在,因为我们可以快速地对矩阵的任意矩形...

    树状数组题解1

    3. POJ2299【基础】: 这道题目要求求解序列中进行多少次交换操作才能将其升序排列。逆序对的数量可以用来表示交换次数。利用树状数组,可以快速计算每个数前面逆序对的数量,进而得到总的逆序对数。 4. POJ3067...

    poj 2352 stars(树状数组,线段树)

    ### POJ 2352 Stars - 树状数组与线段树实现 #### 题目背景 POJ 2352 Stars 是一道经典的算法题目,它提供了使用树状数组或线段树来解决的可能性。这两种数据结构都是为了高效处理区间查询问题而设计的。在这篇...

    树状数组(Binary Indexed Tree)

    **树状数组**(Binary Indexed Tree, BIT),又称**费尼克树**(Fenwick Tree),是一种特殊的数据结构,它能高效地完成对数组元素的累加查询和更新操作。相较于其他数据结构如线段树,树状数组在实现上更为简洁,...

    ACM数据结构之树状数组和线段树

    ### ACM数据结构之树状数组和线段树 #### 线段树 线段树是一种非常有效的数据结构,主要用于解决区间查询问题。它能够快速地处理区间内的各种操作,如查询、修改等。 ##### 线段树的定义与特性 线段树本质上是一...

    poj1990.rar_POJ 19_poj_poj19

    首先,我们要理解树状数组(也称作线段树)这一数据结构。树状数组是一种用于高效处理区间查询和修改的结构,其基础是每个节点存储一个区间内的累积信息。对于POJ 1990题目,我们需要解决的问题可能涉及到对某一区间...

    POJ3468.zip_poj3468

    树状数组,又称二叉索引树(Binary Indexed Tree, BIT),是一种用于快速查询和更新数组区间元素的方法,特别适合处理区间求和以及对数组元素进行批量加法操作的问题。这种数据结构可以达到O(logN)的时间复杂度,...

    史上最全poj题目分类

    树状数组是一种常用的数据结构,树状数组的核心思想是将数据存储在一个树形结构中,然后通过树的遍历进行搜索。例如,在搜索中,树状数组可以用于快速地搜索数据。 数学 数论是一种常用的数学思想,数论的核心思想...

    ACM-POJ 算法训练指南

    1. **高级数据结构**:如树状数组、线段树(poj2528, poj2828, poj2777, poj2886, poj2750)。 2. **平衡树**:如AVL树、红黑树等(poj2482, poj2352)。 3. **并查集**:用于处理不相交集合的问题(poj1195, poj...

    acm poj300题分层训练

    poj1035、poj3080等训练了串的操作,poj2388、poj2299等则涉及排序问题,poj2524、poj1611等是并查集的实例,poj3349、poj3274等展示了哈希表和二分查找,poj3253是哈夫曼树的题目,poj2442和poj1442则关于堆。...

    POJ2352代码

    ### POJ 2352:星图级别分布问题解析 #### 问题描述 本问题主要涉及天文学家对星图的研究。在星图中,星星被表示为平面上的点,并且每个星星都有对应的笛卡尔坐标(X, Y)。定义一个星星的“级别”为在它左下方的...

    acm新手刷题攻略之poj

    - 推荐题目:[poj2388](https://vjudge.net/problem/POJ-2388)、[poj2299](https://vjudge.net/problem/POJ-2299) - 并查集用于处理不相交集合的合并及查询问题。 3. **哈希表** - 推荐题目:[poj3349]...

    求逆序数对1

    树状数组算法是一种高效的解决方法,它使用树状数组来统计逆序数对的数量。树状数组是一种特殊的数组,它可以快速计算某个元素的前缀和。该算法的时间复杂度为 O(n log n)。 算法实现 下面是使用 C++ 实现的 POJ ...

    ACMer需要掌握的算法讲解.docx

    3. 最小树形图(poj3164) 4. 次小生成树 5. 无向图、有向图的最小环 三、数据结构 1. RMQ(poj3264, poj3368) 2. 并查集的高级应用(poj1703, poj2492) 3. KMP 算法(poj1961, poj2406) 4. 左偏树(可合并堆)...

Global site tag (gtag.js) - Google Analytics