P1908 逆序对

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int Maxn = 5e5 + 10;
int n;
ll ans = 0;//树状数组与离散化与逆序对
int tree[Maxn], lisan[Maxn];
struct node {int val, num;
}pot[Maxn];//离散化bool cmp(node a, node b) {if (a.val == b.val) {return a.num < b.num;}return a.val < b.val;
}
inline int lowbit(int x) {return x & -x;
}
inline void add(int x, int k) {while (x <= n) {  // 不能越界tree[x] += k;x += lowbit(x);}
}
inline ll getsum(int x) {ll sum = 0;while (x >= 1) {sum = sum + tree[x];x -= lowbit(x);}return sum;
}int main()
{scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d", &pot[i].val);//输入世界大小pot[i].num = i;}sort(pot + 1, pot + 1 + n, cmp);for (int i = 1; i <= n; i++) {lisan[pot[i].num] = i;//离散化,在不改变原数据大小关系和顺序的前提下,变为1到n;}for (int i = 1; i <= n; i++){//注意add(m,n)标示的是在第m项上加n,而不是在前m项上加nadd(lisan[i], 1);//主要思想是lisan[i]表示第i个数的大小关系,也是第i个数从小到大排第几,将其加一表示这个数已经插入了ans += i - getsum(lisan[i]);//查询lisan[i]之前有多少个数已经被插入,因为在树状数组里lisan[i]前面的都是比他小的,并且一定都存在,如果没有插入就表示他在lisan[i]之后插入//也就是在原数组中的顺序比lisan[i]靠后,比lisan[i]小,又比他位置靠后,那便是逆序数对了,有多少个呢 =i - getsum(lisan[i])}//整体思想离散化后1到n都一定有数,而根据原数组排序依次插入树状数组中,lisan[i]=m;在树状数组在m前面的数已经插入的表示原数组在m前面,还没插入的表示在m后面,而在m后面的便一定是//逆序对printf("%lld\n", ans);return 0;
}

【算法】树状数组 P1908 逆序对相关推荐

  1. 树状数组求逆序对_算法系列之-数组中的逆序对

    题目来源 剑指offer 01 题目描述 在数组中如果前一个数字大于后一个数字,则称为这个数字组合组成一个逆序对.输入一个数组,求所有的逆序对的总数. 如 数组 {7,5,6,4} 则它的逆序对是 ( ...

  2. 树状数组求逆序对_区间和的个数(树状数组)

    327. 区间和的个数 给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper. 区间和 S(i, j) 表示在 nums 中,位置从 i ...

  3. Tido 习题-二叉树-树状数组求逆序对

    这里给大家提供一个全新的求逆序对的方法 是通过树状数组来实现的 题目描述   样例输入 Copy 5 2 3 1 5 4 样例输出 Copy 3 提示       #include<iostre ...

  4. 牛客练习赛33 D tokitsukaze and Inverse Number (树状数组求逆序对,结论)

    链接:https://ac.nowcoder.com/acm/contest/308/D 来源:牛客网 tokitsukaze and Inverse Number 时间限制:C/C++ 1秒,其他语 ...

  5. 树状数组 求 逆序对

    如何统计第i个数与1-第i - 1个数构成多少个逆序对呢? 考虑根据值来建树状数组,初始树状数组为全0,先按序列从左到右将数据的值对应的位置的数加一,代表又有一个数出现.因此,在循环到第i项时,前i- ...

  6. 牛客 - What Goes Up Must Come Down(树状数组求逆序对)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,每次操作可以交换相邻两个数字的位置,现在问最小进行多少次操作,可以使得序列的相对大小呈山峰状(中间高两边低,或非严格递增或非严格递减) 题目分 ...

  7. 蓝桥杯2014届试题9题 小朋友排队(树状数组+类逆序对)

    题目: 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 n 个小朋友站成一排.现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友. 每个小朋友都有一个不高兴的 ...

  8. 【Luogu1908】逆序对(离散化,树状数组求逆序对)

    problem 给你一个长为n的序列A[] 求该序列的逆序对个数 solution 用b[i]保存下标i在A中出现的次数,那么数组b[i]在[l,r]上的区间和,就表示序列A在范围[l,r]内的有多少 ...

  9. loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分...

    $ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...

最新文章

  1. c++监听键盘_你会为颜值买单吗?杜伽fusion复古键盘晒单体验_键盘
  2. java数组交集_Java 实例 – 数组交集
  3. 解决Loadrunner报not writing pre_cci.ci问题
  4. 边缘检测与轮廓检测有什么区别?
  5. ensp支持哪个版本virtualbox_如何在 Fedora 中安装 VirtualBox
  6. JavaScript实现阶乘递归factorialRecursive算法(附完整源码)
  7. R语言tseries包
  8. 构造函数为什么不能是虚函数 ( 转载自C/C++程序员之家)
  9. UI体系的本质是结构化存在
  10. 今天的天气格外地好的dabeicun
  11. node-webki 基本程序结构
  12. oracle中distinct和group by的区别
  13. 图灵奖得主亲授!深度学习视频课程精选
  14. mysql 中的 SCHEMATA 表
  15. 向上沟通:你必须要注意的三个误区
  16. win10 安装 SqlServer2008 亲测可行
  17. delphi中Bmp转Jpeg JPG转BMP
  18. 【C++】算法STL库
  19. BZOJ 2243: [SDOI2011]染色
  20. 《魔兽世界插件》教程—21点扑克游戏 Blackjack

热门文章

  1. matlab fts2mat,[原创]基于MATLAB的通达信股价数据的复权处理(fantuanxiaot版本)
  2. Linux系统centos7安装网卡驱动
  3. PRIMARY KEY,key,unique key
  4. 前端学习之理解304过程
  5. 找回ZIP压缩包密码
  6. 校招真题练习016 雀魂启动!(头条)
  7. 杭电和宁波大学计算机,浙江工业大学VS杭州电子科技大学,谁更好点?
  8. 第三章-80x86微处理器
  9. 骨传导式蓝牙耳机推荐,2022年值得买的骨传导耳机
  10. 树莓派4b学习笔记(1)—— 4B介绍