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

是通过树状数组来实现的

题目描述

 

样例输入 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. 在服务器中无法自宿主启动一个webapi项目,引出查看系统端口是否被占用

    在windows server下启动一个webapi的.net core项目报错 如下图: 让我以为服务器还需要别的配置.后来发现原来是线程被占用了. 在windows下查看某线程是否被占用的命令如下 ...

  2. Android 悬浮窗、悬浮球开发

    原文:Android 悬浮窗.悬浮球开发 1.权限管理 直接看我另外一篇博客吧,传送门: https://my.oschina.net/u/1462828/blog/1933162 2.Base类Ba ...

  3. ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 EF SQLite 支持 上一章节我有提 ...

  4. Codeforces 458A Golden System

    经过计算两个字符串的大小对比 主要q^2=q+1 明明是斐波那契数 100000位肯定超LL 我在每一位仅仅取到两个以内 竟然ac了 #include<bits/stdc++.h> usi ...

  5. Bootstrap Edit 使用方法

    Getting Started <!-- rounded edit text --> <com.beardedhen.androidbootstrap.BootstrapEditTe ...

  6. Full Stack developer and Fog Computing

    尊重开发人员的劳动成果.转载请注明From郝萌主 http://blog.csdn.net/haomengzhu/article/details/40453769 看到这两组词,你是什么感觉? 不知所 ...

  7. EntityFrameworkCore 单表树状结构配置

    数据结构 public class TreeNode { [Key] public long Id { get; set; } public string NodeName { get; set; } ...

  8. C# System.Threading.Timer的使用

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  9. 【Linux】查看物理CPU个数、核数、逻辑CPU个数

    ①物理cpu数:主板上实际插入的cpu数量,可以数不重复的 physical id 有几个(physical id) cat /proc/cpuinfo| grep "physical id ...

  10. Grokking PyTorch

    原文地址:https://github.com/Kaixhin/grokking-pytorch PyTorch is a flexible deep learning framework that ...