Day2:T4求逆序对(树状数组+归并排序)
T4: 求逆序对
A[I]为前缀和
推导 (A[J]-A[I])/(J-I)>=M
A[j]-A[I]>=M(J-I)
A[J]-M*J>=A[I]-M*I
设B[]=A[]-M*();
B[J]>=B[I]
也就是求逆序对;
求逆序对的方法主要有两种:
归并排序;
树状数组;
这里两种方法都学习一下:
1.之前对于树状数组的印象就只有单点修改和区间求和
一直觉得lowbit是一个神奇的东西(至今没有搞懂原理)
上网搜了一下用树状数组求逆序对的方法,发现有一个大神写的很棒....看得很明白(感谢~~)
顺便学了一下离散化,也就是文中的:
for(i=1;i<=n;i++)
{ scanf("%d",&in[i].v); in[i].order=i; } sort(in+1,in+n+1,cmp); for(i=1;i<=n;i++) aa[in[i].order]=i;有点像指针操作。(自己对离散化的初步感受是这样的)
然后就是根据树状数组的原理求逆序对了
其实一直不是很清楚树状数组的原理,翻了翻书才有一点点的领悟吧
1).首先是update中的c数组的理解,上面链接的那个资料中解释的过程会误以为c是统计某个数的个数的
仔细看白书会发现其实并不是这样,c数组是用来维护某一区间的区间和的
getsum的操作也就是把沿途中的长条所表示的区间和加起来,这样可以节省时间(注意理解图)
2).具体的,标程中的c是用来记录在某个区间里有多少个数比i小
3).理解lowbit的过程,同样需要仔细回看白书的解释
无论是i=t-n;i+=lowbit(i)或是i-=lowbit(i)都是一个找父亲的过程
4).其实说白了lowbit到底有什么用呢,其实也就是节省了时间,做到快速简便而已吧
嗯...这样的话,对于树状数组的原理算是搞懂了QAQ感觉这种东西很容易忘记怎么办?
给以后的自己一个忠告呗~先看白书,好好理解图,再看自己的感悟,最后看链接资料;
2.另一种方法就是很传统的用:归并排序求逆序对
这种算法求逆序对也很容易理解,简单的说也无非就是基于快排思想+统计个数
主要的程序:p版的...不要在意这些细节...
procedure mergesort(l,r:longint);
var
mid,i,j,k:longint;
begin
if l=r then exit;
mid:=(l+r) div 2;
mergesort(l,mid);
mergesort(mid+1,r);
i:=l;j:=mid+1;k:=l;
while (i<=mid) and (j<=r) do
if v[i]<v[j] then
begin
push(k,i);
ans:=ans+r-j+1;//在l..mid 和 mid+1 ..r中j处于[mid+1,r]中且这段是升序的,那么如果v[j]>v[i]那么v[j..r]都会大于//v[i]这和求逆序对有异曲同工之妙
end
else
push(k,j);
while i<=mid do push(k,i);
while j<=r do push(k,j);
for i:=l to r do v[i]:=temp[i];
end;
根据推导建立等式,之后输出ans即可
很好理解就不多说了...
晚安民那
Day2:T4求逆序对(树状数组+归并排序)的更多相关文章
- 求逆序对[树状数组] jdoj
求逆序对 题目大意:给你一个序列,求逆序对个数. 注释:n<=$10^5$. 此题显然可以跑暴力.想枚举1到n,再求在i的后缀中有多少比i小的,统计答案即可.这显然是$n^2$的.这...显然过 ...
- 【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 ...
- POJ 2299 Ultra-QuickSort 逆序数 树状数组 归并排序 线段树
题目链接:http://poj.org/problem?id=2299 求逆序数的经典题,求逆序数可用树状数组,归并排序,线段树求解,本文给出树状数组,归并排序,线段树的解法. 归并排序: #incl ...
- luogu P1908 逆序对 |树状数组
题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为"逆序对"的 ...
随机推荐
- Android游戏开发研究帧动画实现
1.动画的原则框架 帧的动画帧的动画顾名思义,画就是帧动画. 帧动画和我们小时候看的动画片的原理是一样的,在同样区域高速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,事实上只 ...
- VB.NET与C# 语法show差异
学习VB.NET后发现,VB.NET与C#的语法基本的不同在两个部分,这两部分搞通了,那就游刃有余,迎刃而解了. 现将其对照总结例如以下: 一.实体部分 (与VB相比.在C#和VB.NET中,实体的使 ...
- c++的vector容器
c++还有一个很常用的容器就是vector容器,他是数组实现的,是一种可变长的容器,在很多的时候可以简化我们的编程.可学习的链接:http://www.cnblogs.com/mr-wid/archi ...
- bash shell:重定向标准错误输出
如何重定向标准错误输出到标准输出?如何把标准错误输出输出到一个文件? Bash提供了I/O重定向工具,有3个缺省的文件(标准输出流): stdin - 用来获取输入,比如键盘.文件重定向 stdout ...
- 我的MYSQL学习心得(七)
原文:我的MYSQL学习心得(七) 我的MYSQL学习心得(七) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL ...
- hardware_hp刀片服务器安装windows 2008系统配置
2012年10月26日星期五 第一步. 看刀片机柜的后的OA地址 点击 OK 查看 Actlve OA 例如: 192.168.254.31 l 第二步: 连接PC 到左侧第一个接口 修改本机ip为同 ...
- ftk学习记录(button一片)
[ 声明:版权所有所有.欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前面,我们说到了label,这里能够看一下label执行的效果是怎么样的. waterma ...
- Hadoop-2.4.1学习之Writable及事实上现
Hadoop基于DataInput和DataOutput实现了简单.高效的序列化协议,而Writable接口定义了Hadoop序列化的方法,MapReduce框架中的不论什么键值类型都实现了该接口,比 ...
- 防SQL注入:生成参数化的通用分页查询语句
原文:防SQL注入:生成参数化的通用分页查询语句 前些时间看了玉开兄的“如此高效通用的分页存储过程是带有sql注入漏洞的”这篇文章,才突然想起某个项目也是使用了累似的通用分页存储过程.使用这种通用的存 ...
- IOS中 类扩展 xib
一.类扩展(class extension,匿名分类) .格式 @interface 类名 () { // 成员变量... } // 方法声明... @end .作用 > 写在.m文件中 > ...