博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dynamic Rankings——带修改区间第k大
阅读量:6221 次
发布时间:2019-06-21

本文共 654 字,大约阅读时间需要 2 分钟。

三种做法:

1.整体二分:

二分mid

考虑小于mid的修改的影响

但是大于mid的修改可能会干掉小于mid的一些值

所以额外把一个修改变成一个值的删除和一个值的添加

这样就相互独立了!

整体二分,树状数组维护即可。

2.树状数组套动态开点线段树

树状数组每个点维护一个线段树,空间O(Nlog^2N)

修改的时候,修改logn个点的线段树,每个点把旧权值--,新权值++。复杂度O(log^2N)

查询的时候,找到[1,l-1],[1,r]两个前缀对应的logn个线段树,然后logn个线段树和logn个线段树差分一下

复杂度O(log^2N)

如果值域过大就离散化。

(不过既然离散化要离线,何不直接整体二分?)

3.分块

万事皆可分块

块内维护原数组(方便修改),排序后的数组

查询,外面二分一个mid,每个块二分小于等于mid第一个数的位置,求出小于等于mid的数的个数。边界暴力处理即可。

修改,直接暴力重构整个块

(也可以每个块维护一个动态开点线段树,不过常数大,而且还不如法二优秀)

O(nsqrt(n)log^2n)由于一个logn比较虚,而且常数很小。所以可过!(惊了)

 

 

加强版:

带修改带插入区间第K大?

正解:替罪羊树套动态开点线段树(log^2N 并不会)

疯狂暴力:分块。还是上面的做法,插入也重构,超过根号必要的时候可以裂解。每次二分到哪个块的哪个位置。还是可以过(惊了)

 

转载于:https://www.cnblogs.com/Miracevin/p/10200523.html

你可能感兴趣的文章
Apache日志分析 shell短语
查看>>
大型网站系统架构的演化
查看>>
Nginx 中last和break 及 permanent 和 redirect 的爱恨情仇
查看>>
致歉!《迟来的观后感》一文存在问题!
查看>>
mysql 安全
查看>>
【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题...
查看>>
Options for mounting NFS filesystem
查看>>
Linux学习-第四节课
查看>>
delphi获取剩余磁盘空间
查看>>
keepalived
查看>>
java通过报文交换数据
查看>>
HTTP/2 对 Web 性能的影响(下)
查看>>
深入浅出OOP(四): 多态和继承(抽象类)
查看>>
Spring Boot 为什么这么火?
查看>>
MySQL常用命令
查看>>
Android中用广播从Service中向Activity发送信息
查看>>
报表工具轻松搞定卡片式报表
查看>>
如何处理报表中的舍位平衡
查看>>
SQLServer 延迟事务持久性
查看>>
六个编程范型将改变你对编程的看法
查看>>