剩下一点点时间,就来说说最近才会的关于bit的两个妙用。

求一组数的逆序对

求最长不下降序列

其实两个东西思想差不多,就已第一个为例讲讲。

就是所有数排一遍后,再按照原序列顺序(从后往前),做如下操作:

1、1-(这个数排名-1)的区间和,结果加到答案中

2、把这个数排名为+1

操作1、2分别对应区间查询和单点修改,于是就是bit维护。

为什么这样就是答案呢?

因为如果有比这个数更小的,且在这个数之后,那么在这个更小的数在之前就已经加入到bit中,也就是排名小于当前数的数且都在bit中的数(也就意味着在这个数之后且小于这个数),便与这个数成逆序对。

最长不下降序列也差不多,只是询问的是区间最值罢了。

最后注意数值重复的情况!!!


var
i,j,k,l,n,ans,tot:longint;
a,b,c,tree:array[..]of longint; procedure swap(var x,y:longint);
var
i:longint;
begin
i:=x;
x:=y;
y:=i;
end; procedure qsort(l,r:longint);
var
i,j,k,mid:longint;
begin
i:=l;
j:=r;
mid:=a[(l+r)>>];
repeat
while a[i]>mid do inc(i);
while a[j]<mid do dec(j);
if i<=j then begin
swap(a[i],a[j]);
swap(b[i],b[j]);
inc(i);
dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end; function lowbit(x:longint):longint;
begin
exit(x and (-x));
end; function ask(x:longint):longint;
var
sum:longint;
begin
sum:=;
while x> do begin
inc(sum,tree[x]);
dec(x,lowbit(x));
end;
exit(sum);
end; procedure add(x:longint);
begin
while x<=n do begin
inc(tree[x]);
inc(x,lowbit(x));
end;
end; begin
readln(n);
for i:= to n do begin
read(a[i]);
b[i]:=i;
end;
qsort(,n);
tot:=;
for i:=n downto do begin
if a[i]<>a[i+] then inc(tot);
c[b[i]]:=tot;
end;
for i:=n downto do begin
ans:=ans+ask(c[i]-);
add(c[i]);
writeln(ans);
end;
end. var
a,b,c,tree,f:array[..]of longint;
i,j,k,l,n,m,tot:longint; procedure swap(var x,y:longint);
var
i:longint;
begin
i:=x;
x:=y;
y:=i;
end; function max(x,y:longint):longint;
begin
if x>y then exit(x);
exit(y);
end; procedure qsort(l,r:longint);
var
i,j,k,mid:longint;
begin
i:=l;
j:=r;
mid:=a[(l+r)>>];
repeat
while a[i]>mid do inc(i);
while a[j]<mid do dec(j);
if i<=j then begin
swap(a[i],a[j]);
swap(b[i],b[j]);
inc(i);
dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end; function lowbit(x:longint):longint;
begin
exit(x and (-x));
end; function ask(x:longint):longint;
var
sum:longint;
begin
sum:=;
while x> do begin
sum:=max(sum,tree[x]);
dec(x,lowbit(x));
end;
exit(sum);
end; procedure add(x,y:longint);
begin
while x<=n do begin
tree[x]:=max(tree[x],y);
inc(x,lowbit(x));
end;
end; begin
readln(n);
for i:= to n do begin
read(a[i]);
b[i]:=i;
end;
qsort(,n);
tot:=;
k:=;
for i:= to n do begin
if a[i]<>a[i-] then inc(tot);
c[b[i]]:=tot;
end;
for i:=n downto do begin
f[i]:=ask(c[i]-)+;
add(c[i],f[i]);
if f[i]>k then k:=f[i];
end;
writeln(k);
end.

【以前的空间】BIT的两个小小运用的更多相关文章

  1. linux系统的磁盘空间限制的两种方法

    最近在搞VPS,要用到磁盘的限额,在网上找了一些相关的资料,总结起来,有两个方法能实现,一是用quota,另外一种是限制目录大小,下面我就将这两种方法写出来,与大家一起分享! 首先我们来看第一种方法, ...

  2. 剑指offer-第五章优化时间和空间效率(两个链表的第一个公共节点)

    思路1:要求的是两个链表的第一个公共节点,首先想到的是用栈来存放两个链表,然后依次从栈中抛出,直到最后一个相同的节点为止.但是要用到两个栈,空间复杂度为O(n): 思路2:从头到尾分别遍历两个链表得到 ...

  3. 2D空间中求两圆的交点

    出处:https://stackoverflow.com/questions/19916880/sphere-sphere-intersection-c-3d-coordinates-of-colli ...

  4. 算法(JAVA)----两道小小课后题

    LZ最近翻了翻JAVA版的数据结构与算法,无聊之下将书中的课后题一一给做了一遍,在此给出书中课后题的答案(非标准答案,是LZ的答案,猿友们可以贡献出自己更快的算法). 1.编写一个程序解决选择问题.令 ...

  5. 求空间内两条直线的最近距离以及最近点的坐标(C++)

    关键词:空间几何 用途:总有地方会用到吧 文章类型:C++函数展示 @Author:VShawn(singlex@foxmail.com) @Date:2016-11-19 @Lab: CvLab20 ...

  6. ArcGIS Engine开发之空间查询

    空间查询功能是通过用户选择的空间几何体以及该几何体与当前地图中要素之间的几何关系进行空间查找,从而得到查询结果的操作. 相关类与接口 空间查询相关的类主要是SpatialFilter类,其实现的接口主 ...

  7. [Linux] -Docker修改空间大小

    Docker默认空间大小分为两个,一个是池空间大小,另一个是容器空间大小. 池空间大小默认为:100G 容器空间大小默认为是:10G 所以修改空间大小也分为两个: 这里使用centos下的yum进行安 ...

  8. 3.2 一般的哈尔空间Vj

    例3.2给予我们继续往下面做的动力.很明显的我们对于g(t)的逼近还是太粗糙了.很自然的,我们会想到,如果继续细分我们的短点,比如每1/2取一个值,甚至每1/4取一个值,那么就会有更好的逼近效果. 不 ...

  9. stl空间配置器线程安全问题补充

    摘要 在上一篇博客<STL空间配置器那点事>简单介绍了空间配置器的基本实现 两级空间配置器处理,一级相关细节问题,同时简单描述了STL各组件之间的关系以及设计到的设计模式等. 在最后,又关 ...

随机推荐

  1. iOS性能调优工具

    总结: 三类工具 基础工具 (NSLog的方式记录运行时间.) 性能工具.检测各个部分的性能表现,找出性能瓶颈 内存工具.检查内存正确性和内存使用效率 性能工具: 可以衡量CPU的使用,时间的消耗,电 ...

  2. 使用ListView+ObjectDataSource+DataPager实现增删改查加分页

    一.配置objectDataSource 选择业务逻辑层的类 二.配置Select对应的方法,必须是一个带两个整型参数的方法,第一个参数表示要查看的第一条记录的前一条30,第二个参数每页最多能显示的记 ...

  3. 180608-Git工具之Stash

    git stash 暂存 背景: 实际开发过程中,经常可能遇到的一个问题,当你在dev分支上正开发得happy的时候:突然来了个线上bug,得赶紧从release分支上切一个bugfix分支来解决线上 ...

  4. postman使用感言

    这段时间接口测试一直使用的postman,一款谷歌接口测试插件,感受如下 优点: 1.对于中小型公司来说应该是够用的,特别是一键接口环境切换,一键设置header,作为一般的接口测试来说已经很不错了, ...

  5. idea前端页面不刷新----springboot

    修改这里就好了

  6. [wirtting] top01 independent

    Do you agree or disagree with the following statement? At universities and colleges, sports and soci ...

  7. 【zabbix 监控】第二章 安装测试被监控主机

    客户端安装测试 一.准备两台被监控主机,分别做如下操作: web129:192.168.19.129 web130:192.168.19.130 [root@web129 ~]#yum -y inst ...

  8. JQuery+ajax数据加载..........

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Ext JS 6学习文档-第7章-图表

    Ext JS 6学习文档-第7章-图表 使用图表 本章中将探索在 ExtJS 中使用不同类型的图表并使用一个名为费用分析的示例项目结束本章所学.以下是将要所学的内容: 图表类型 条形图 和 柱形图 图 ...

  10. Spring MVC 整合Swagger的一些问题总结

    在做Spring MVC 整合swagger的时候,遇到的两个问题: 第一个问题 在网上找了一些Spring MVC 和Swagger的例子,照着一步步的配置,结果,到最后,项目都起来了,没有任何问题 ...