https://www.luogu.org/problem/P1908

比较喜欢线段树,懒得用树状数组(只会套模板,位运算的精髓没有领悟到),一直没有记录树状数组代码,又得捡回来,趁这道题记录一下模板,为三维偏序cdq套树状数组铺垫一下。

解题思路:先对原数组a从大到小排序,依次添加进树状数组c里,每次求前缀和的结果就是 当前数的逆序对的个数。

例如数据:55,44,22,66,33,11

初始化树状数组c,清0;

添加66到4号位,则添加数组为 0,0,0,1,0,0; 66前没有比它大的数,逆序对个数为,树状数组C为0,0,0,1,0,0;

添加55到1号位,则添加数组为 1,0,0,1,0,0; 55前没有比它大的数,逆序对个数为,树状数组C为1,1,0,2,0,0;

添加44到2号位,则添加数组为 1,1,0,1,0,0; 44前有55比它大,逆序对个数为,树状数组C为1,2,0,3,0,0

添加33到5号位,则添加数组为 1,1,0,1,1,0; 33前有55,44,66比它大,逆序对个数为,树状数组C为1,2,0,3,1,1

添加22到3号位,则添加数组为 1,1,1,1,1,0; 22前有55,44,66比它大,逆序对个数为,树状数组C为1,2,1,4,1,2

添加11到6号位,则添加数组为 1,1,1,1,1,1; 11前有55,44,22,66,33比它大,逆序对个数为,树状数组C为1,2,1,4,1,2

坑:如果有相同的数,则排序时按照后面的先添加,这样就不会重复计算逆序对。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<ctime>
#define ll long long
#define inf 0x3f3f3f3f
const double pi=3.1415926;
using namespace std; const int maxx=;
struct node
{
int id;
int val;
};
node a[maxx];///原数组
int c[maxx];///树状数组
int n; bool cmp(node p1,node p2)
{
if(p1.val==p2.val)///坑
return p1.id>p2.id;
return p1.val>p2.val;
} int lowbit(int x)
{
return x&(-x);
} void add(int x,int val)///在x的位置添加val值
{
while(x<=n+)
{
c[x]+=val;
x+=lowbit(x);
}
} int sum(int x)
{
int res=;
while(x>)
{
res+=c[x];
x-=lowbit(x);
}
return res;
} int main()///P1908
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i].val),a[i].id=i;
sort(a+,a+n+,cmp);
ll ans=;
for(int i=;i<=n;i++)
{
ans +=(ll)sum(a[i].id);
add(a[i].id,);
}
printf("%lld\n",ans);
return ;
}

P1908 逆序对-(树状数组)的更多相关文章

  1. P1908 逆序对——树状数组&离散化&快读快写の学习

    题目简述: 对于给定的一段正整数序列,逆序对就是序列中 a_i>a_jai​>aj​ 且 i<ji<j 的有序对. 输出序列中逆序对的数目. 知识补充: 树状数组: 这东西就是 ...

  2. 洛谷 P1908 逆序对(树状数组解法)

    归并排序解法:https://www.cnblogs.com/lipeiyi520/p/10356882.html 题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不 ...

  3. luogu P1908 逆序对 |树状数组

    题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为"逆序对"的 ...

  4. [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)

    [BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...

  5. Bzoj 2141: 排队 分块,逆序对,树状数组

    2141: 排队 Time Limit: 4 Sec  Memory Limit: 259 MBSubmit: 1310  Solved: 517[Submit][Status][Discuss] D ...

  6. 求逆序对[树状数组] jdoj

    求逆序对 题目大意:给你一个序列,求逆序对个数. 注释:n<=$10^5$. 此题显然可以跑暴力.想枚举1到n,再求在i的后缀中有多少比i小的,统计答案即可.这显然是$n^2$的.这...显然过 ...

  7. luogu1908 逆序对 树状数组

    题目大意:对于给定的一段正整数序列,逆序对就是序列中ai>aj且i<j的有序对.求一段序列的逆序对数. 对于一个数组T,其一个点的值为值与该点下标相等的A序列中点的个数.对T维护一个树状数 ...

  8. 【a703】求逆序对(树状数组的解法)

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 给定一个序列a1,a2...an.如果存在i小于j 并且ai大于aj,那么我们称之为逆序对,求给定序列中逆序 ...

  9. BZOJ - 3295 动态逆序对 (树状数组套treap)

    题目链接 思路和bzoj2141差不多,不过这道题的数据更强一些,线段树套treapT了,树状数组套treap卡过~~ #include<bits/stdc++.h> using name ...

  10. ACM学习历程—HDU5592 ZYB's Premutation(逆序数 && 树状数组 && 二分)(BestCoder Round #65 1003)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5592 题目大意就是给了每个[1, i]区间逆序对的个数,要求复原原序列. 比赛的时候2B了一发. 首先 ...

随机推荐

  1. oracle--报错 ORA-00257

    [oracle@oracle01 ~]$ rman target/ RMAN-: =========================================================== ...

  2. SqlServer 通过日志恢复数据库

    前期工作 查看数据属性,确保下条件: 1.数据库属性->选项->恢复模式=完整 2.建好库以后.一个数据库完整的数据备份 3.到出事期间日志没有你间断 4.记录出事的准确时间 一.数据准备 ...

  3. 基于canvas自动化运维工具

    首先我们的工具绝对顶尖,绝对绚丽.如果有需要代码,可以加我微信索取.18500591275 前几天有个客户找到我,问我这个能不能做,我看自己也干了10年前端了,实在做不了,后来人家说给你10000你能 ...

  4. 【前端知识体系-CSS相关】CSS基础知识强化

    1.CSS样式(选择器)的优先级? 1.1 权重的计算规则 第一优先级:无条件优先的属性只需要在属性后面使用!important.它会覆盖页面内任何位置定义的元素样式.(ie6支持上有些bug). 第 ...

  5. java中的对象、类、包、模块、组件、容器、框架、架构的概念入门

    在Java中有那么一些概念:对象.类.包.模块.组件.容器.框架.这些概念都有一个共同的特点,就是[容纳]. 对象(Object) 在Java的世界里,对象是通过属性和方法来分别对应事务所具有的静态属 ...

  6. 2019-11-29-WPF-测试触摸设备发送触摸按下和抬起不成对

    原文:2019-11-29-WPF-测试触摸设备发送触摸按下和抬起不成对 title author date CreateTime categories WPF 测试触摸设备发送触摸按下和抬起不成对 ...

  7. ASP.NET Core In Process Hosting on IIS with ASP.NET Core 2.2(转载)

    ASP.NET Core 2.2 has been out for a while now and with it come some significant improvements to the ...

  8. AspNet Core结合Quartz使用定时任务且通过注入缓存或者配置参数

    一.经常在项目会用到定时任务同步数据或更新缓存等操作,在很久以前我们可能经常会用一个多线程或timer来做定时任务,这样能实现比较简单轻量级的任务:对于任务多且都调用频率不一样的任务,我们都会用到Qu ...

  9. [個人紀錄] git 疑難排解

    1.git pull 時發生錯誤,要拉下來的檔案內含有檔名太長的檔案 ans: https://stackoverflow.com/questions/22575662/filename-too-lo ...

  10. JVM:带你查看常见的问题,以及分析处方法

    一.前言 各位开发和运维同学,在项目实施落地的过程中,尤其是使用EDAS.DRDS.MQ这些java中间件时,肯定会遇到不少JAVA程序运行和JVM的问题.我结合过去遇到的各种各样的问题和实际处理经验 ...