这里给大家提供一个全新的求逆序对的方法

是通过树状数组来实现的

题目描述

 

样例输入 Copy

5
2 3 1 5 4

样例输出 Copy

3

提示

 
 
 
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
using namespace std;
struct lisan{
long long val,index;
};
lisan a[];
long long C[];
int nn;
int cmp1(lisan a,lisan b){
if(a.val==b.val)return a.index<b.index;//sort的不稳定性
//因为再下一次是按照下标再排回来,所以如果有数值相等的数,原来的下标先后顺序不能改变,否则会出现一些玄学错误
return a.val<b.val;
}
int cmp2(lisan a,lisan b){
return a.index<b.index;
} int lowbit(int x){
return x&(-x);
}
void add(int x,int d){
while(x<=nn){
C[x]+=d;
x+=lowbit(x);
}//修改是从左往右
}
long long sum(int x){
long long ret=;
while(x>){
ret+=C[x];
x-=lowbit(x);//求和是从右往左
}
return ret;
}
int main()
{
int n;
cin>>n;
for(int i=;i<=n;i++){
cin>>a[i].val;
a[i].index=i;
}
//数据离散化模式开始
sort(a+,a+n+,cmp1);
int x=;
for(int i=;i<=n;i++){
if(a[i].val==a[i-].val)
a[i].val=x;
else
a[i].val=++x;
}
nn=x;
sort(a+,a+n+,cmp2); //开始前缀和
long long ans=;
for(int i=n;i>=;i--){
add(a[i].val,);
ans+=sum(a[i].val-);
}
cout<<ans; return ;
}
思路讲解:
假如有8个数,
a:1 3 2 4 3 1 2 4
从后往前扫
设一个数组分别表示从后往前扫当前每个数值一共出现了几次
一开始是这样的,扫最后一个4
b:0 0 0 1
b[4]之前全是0,所以ans=0+0+0 这里的前缀和用树状数组就可以
再扫2
b:0 1 0 1       b[2]之前全是0
再扫1
b:1 1 0 1     b[1]之前还是0
再扫3
1 1 1 1     终于b[3]之前1+1=2意思也就是之前的两个1,代表已经扫过的1、2分别出现了一次
也就是说,在a数组中,a[5]后比3小的一共有两个
如此往下。。。。。
但是这一题每一个数的最大值是10的九次方,要是开数组的话就炸了
但是数的个数最多只有100000
所以可用数据离散化
先从小到大排序
都压成1,2,3.。。。
 
 
至于数据离散化是什么呢
就是比如原来有一组数1 2 45 67568684 3252 653357.
因为数据范围较大,但是数的个数却不是很大
但是如果有的数太大有的数太小
就会不是非常方便
这样如果用这个数的数值作为一个数组的下标,当然就方便多了
我们在使用的时候只看重数与数之间谁大谁小的关系
可以把上面的一行数缩成1 2 3 6 4 5

Tido 习题-二叉树-树状数组求逆序对的更多相关文章

  1. POJ2299Ultra-QuickSort(归并排序 + 树状数组求逆序对)

    树状数组求逆序对   转载http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 转载: 树状数组,具体的说是 离散化+树 ...

  2. [NOIP2013提高&洛谷P1966]火柴排队 题解(树状数组求逆序对)

    [NOIP2013提高&洛谷P1966]火柴排队 Description 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相 ...

  3. [NOI导刊2010提高&洛谷P1774]最接近神的人 题解(树状数组求逆序对)

    [NOI导刊2010提高&洛谷P1774]最接近神的人 Description 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某 ...

  4. 【bzoj2789】[Poi2012]Letters 树状数组求逆序对

    题目描述 给出两个长度相同且由大写英文字母组成的字符串A.B,保证A和B中每种字母出现的次数相同. 现在每次可以交换A中相邻两个字符,求最少需要交换多少次可以使得A变成B. 输入 第一行一个正整数n ...

  5. “浪潮杯”第九届山东省ACM大学生程序设计竞赛(重现赛)E.sequence(树状数组求逆序对(划掉))

    传送门 E.sequence •题意 定义序列 p 中的 "good",只要 i 之前存在 pj < pi,那么,pi就是 "good": 求删除一个数, ...

  6. 2021.12.10 P5041 [HAOI2009]求回文串(树状数组求逆序对)

    2021.12.10 P5041 [HAOI2009]求回文串(树状数组求逆序对) https://www.luogu.com.cn/problem/P5041 题意: 给一个字符串 \(S\) ,每 ...

  7. NOIP 2013 洛谷P1966 火柴排队 (树状数组求逆序对)

    对于a[],b[]两个数组,我们应选取其中一个为基准,再运用树状数组求逆序对的方法就行了. 大佬博客:https://www.cnblogs.com/luckyblock/p/11482130.htm ...

  8. poj3067 Japan 树状数组求逆序对

    题目链接:http://poj.org/problem?id=3067 题目就是让我们求连线后交点的个数 很容易想到将左端点从小到大排序,如果左端点相同则右端点从小到大排序 那么答案即为逆序对的个数 ...

  9. 牛客练习赛38 D 题 出题人的手环 (离散化+树状数组求逆序对+前缀和)

    链接:https://ac.nowcoder.com/acm/contest/358/D来源:牛客网 出题人的手环 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他 ...

随机推荐

  1. 《Facebook效应》

    前两年风靡了一阵子的电影<社交网络>毕竟是电影,一种艺术的方式的表达.虽然无法完全的印证<Facebook 效应>一书中记载的正确性,但其细节足以给人启示. 电影中,主人公炫酷 ...

  2. IIS元数据库失败该如何解决-重新安装ASP.NET

    装了VS2005再装IIS,结果出了些小问题 “访问IIS元数据库失败 ” 思考可能是次序出了问题,解决 1.打开CMD,进入 C:\WINDOWS\Microsoft.NET\Framework\v ...

  3. 关闭Wind XP/Vista/Win7的DEP数据执行保护汇总(转)

    数据执行保护 (DEP) 是一种Windows安全机制,从Windows版本顺序上看是从Windows XP SP2开始引入,通过监视程序以确保它们使用的系统内存是安全的,帮助防止操作系统受到病毒和其 ...

  4. Web 程序的建立

    1 导读 web 基础研发体系指的是, web 研发中一线工程师所直接操作的技术.工具,以及所属组织架构的总和.在过去提升企业研发效能的讨论中,围绕的主题基本都是——”通过云计算.云存储等方式将底层核 ...

  5. Linux(Centos7)下自动启动程序

    1.文件转移 先将要执行的文件转移或复制到路径较短的地方如:/usr/local 主要是为了方便,同时防止误删.2.编写Service文件 $ vim /usr/lib/systemd/system/ ...

  6. 它们的定义Activity跳转动画

    本来觉得是一个非常小的需求, 后来我发现总是 错误, 采用Theme于 4.0在 操作不是很容易使用. 后来查阅资料, 须要在finish 后面 和 startActivity 后面加入 overri ...

  7. 论题Cascade Object Detection with Deformable Part Models一个怀疑

    该文的作者是Pedro F. Felzenszwalb等一下,著名DPM在目标检测模型.本文的工作是DPM(变形组件模型)级联,以加快检测速度. 加速的方式,现在其次是计算总结成绩的某些部分,假设小于 ...

  8. HDU 3153 Pencils from the 19th Century(数学)

    主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3153 Problem Description Before "automaton" ...

  9. Gtkmm在dev-cpp下的配置

    Gtkmm安装 1.  首先安装dev-cpp 2.  然后安装最新的gtkmm2.4来自http://www.pcpm.ucl.ac.be/~gustin/win32_ports/index.htm ...

  10. 细数Windows 的那些小技巧!

    以下整理自知乎 Windows 有哪些你相见恨晚的技巧?和Quora(英文版) What are some secret tricks you should know about Windows? 等 ...