求逆序对[树状数组] jdoj
求逆序对
题目大意:给你一个序列,求逆序对个数。
注释:n<=$10^5$。
此题显然可以跑暴力。想枚举1到n,再求在i的后缀中有多少比i小的,统计答案即可。这显然是$n^2$的。这...显然过不去,我们思考如何优化?显然,这里的有些过程是重复的。我们将这个序列设为a序列,对于两个1到n中的整数i<j,在j后面的数我们进行了多次重复枚举,我们思考如何优化。容易想到用一个桶来记录。只需要记录对于每一个数来讲,我后面有多少个数是比我小的,只需要将桶中的数累加即可。但是,我们必须记录是这个数之后的桶的含义,也就是说这个数之前的桶我们不可以进行修改,所以我们必须逆向枚举,这时一种做法,但是我们这里讲另一种做法:正向枚举。我们只需要记录这个数之前的桶的状况即可,查询时,只需要记录当前桶的前缀和,但是,我们如何修改这个前缀和?如果用数组实现的话修改是O(n)的,所以这个时间复杂度还是$n^2$的。而这个过程我们可以用树状数组维护。树状数组是针对桶的,也就是说,我树状数组记录的也是区间和,只不过这个区间和是针对桶的。我们在修改的时候只需要对于前面的,所有能看见这个数的树状数组进行修改。每个树状数组的节点的视野就是它后面的数。在查询时,我们只需要查询在这个数视野之内的数。显然,我们对于视野的理解是贪心的,即,这个数只能看见比自己大的数的桶。
最后,附上丑陋的代码......
#include <iostream>
#include <cstdio>
#define N 100010
using namespace std;
typedef long long ll;
int n,a[N],sum[N];
ll ans;
inline void fix(int x)
{
while(x)sum[x]++,x-=x&(-x);
}
inline int getsum(int x)
{
int re=;
while(x<=)re+=sum[x],x+=x&(-x);
return re;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++)
{
ans+=getsum(a[i]+);
fix(a[i]);
}
printf("%lld",ans);
return ;
}
真难理解啊,博主智商低啊!!
求逆序对[树状数组] jdoj的更多相关文章
- 【a703】求逆序对(树状数组的解法)
Time Limit: 10 second Memory Limit: 2 MB 问题描述 给定一个序列a1,a2...an.如果存在i小于j 并且ai大于aj,那么我们称之为逆序对,求给定序列中逆序 ...
- [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)
[BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...
- Bzoj 2141: 排队 分块,逆序对,树状数组
2141: 排队 Time Limit: 4 Sec Memory Limit: 259 MBSubmit: 1310 Solved: 517[Submit][Status][Discuss] D ...
- luogu1908 逆序对 树状数组
题目大意:对于给定的一段正整数序列,逆序对就是序列中ai>aj且i<j的有序对.求一段序列的逆序对数. 对于一个数组T,其一个点的值为值与该点下标相等的A序列中点的个数.对T维护一个树状数 ...
- P1908 逆序对——树状数组&离散化&快读快写の学习
题目简述: 对于给定的一段正整数序列,逆序对就是序列中 a_i>a_jai>aj 且 i<ji<j 的有序对. 输出序列中逆序对的数目. 知识补充: 树状数组: 这东西就是 ...
- 洛谷 P1908 逆序对(树状数组解法)
归并排序解法:https://www.cnblogs.com/lipeiyi520/p/10356882.html 题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不 ...
- BZOJ - 3295 动态逆序对 (树状数组套treap)
题目链接 思路和bzoj2141差不多,不过这道题的数据更强一些,线段树套treapT了,树状数组套treap卡过~~ #include<bits/stdc++.h> using name ...
- luogu P1908 逆序对 |树状数组
题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为"逆序对"的 ...
- ACM学习历程—HDU5592 ZYB's Premutation(逆序数 && 树状数组 && 二分)(BestCoder Round #65 1003)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5592 题目大意就是给了每个[1, i]区间逆序对的个数,要求复原原序列. 比赛的时候2B了一发. 首先 ...
随机推荐
- Java获取当前的年月
今天,我在尝试从数据库取数据的过程中,发现页面初始化时需要给时间控件赋初值.于是,我就写了一个获取当前年月的时间工具类. 1.具体源码如下: YearAndMonth.java: /** * @Tit ...
- Java报SQLException
Java报SQLException 具体错误如下: java.sql.SQLException:Column count doesn't match value count at row 1
- 硬盘GPT分区与MBR分区的转换
如何将gpt分区更改成mbr分区? "因为笔记本电脑硬盘分区表是GPT而导致大家无法安装引导系统.需要转换为MBR分区还能顺利安装." 问题是,分区工具无法转换MBR,这里小编知道 ...
- java.sql.SQLException:Column count doesn't match value count at row 1
1.错误描述 java.sql.SQLException:Column count doesn't match value count at row 1 2.错误原因 在插入数据时,插入的字段 ...
- 让微信,qq,uc浏览器使用全屏模式,全屏模式里,浏览器是不会上下左右滑动出现背景的
<meta name="x5-fullscreen" content="true"> <meta name="full-screen ...
- JNDI在本项目中的应用
一,在tomcat的context文件中做如下配置 <?xml version="1.0" encoding="UTF-8"?> <Conte ...
- 英文汉语切换的导航栏,纯css制作。
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 第一节 JDK是什么?JRE是什么?JDK和JRE的区别?以及jdk安装和测试。
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作为静态面向对象编程语言的代表 ...
- 【BZOJ4566】找相同字符(后缀数组)
[BZOJ4566]找相同字符(后缀数组) 题面 BZOJ 题解 后缀数组的做法,应该不是很难想 首先看到两个不同的串,当然是接在一起求\(SA,height\) 那么,考虑一下暴力 在两个串各枚举一 ...
- MSIL实用指南-IL版hello world
我们学习编程开始时,一般用输出"hello world"的一段程序. C#版的"hello world"是 using System; namespace L0 ...