博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj2006 [NOI2010]超级钢琴 (及其拓展)
阅读量:6320 次
发布时间:2019-06-22

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

给定一个序列,求长度在 \([L,\ R]\) 之间的区间和的前 \(k\) 大之和

\(n\leq5\times10^5,\ k\leq2\times10^5,\ |a_i|\leq10^3\)

贪心,堆

令状态 \((s,\ l,\ r)\) 表示左端点为 \(s\) ,右端点在 \([l,\ r]\) 中,使得区间和最大的右端点

容易发现 \(t=(s,\ l,\ r)\) 即为前缀和在 \([l,\ r]\) 中最大值的位置

假设每次都选最优区间,显然像这样选 \(k\) 次就是最终答案

假设当前最优状态为 \((s,\ l,\ r)\) ,显然不能再取一遍 \([s, t]\) ,但是其他决策可能会出现在 \(t\) 左右两端区间中

因此将 \((s,\ l,\ t - 1)\)\((s,\ t + 1,\ r)\) 加入待选决策点即可

这玩意儿可以用堆来维护

时间复杂度 \(O((n+k)\log n)\)


给定 \(n\) 个非负整数,求两两异或值前 \(k\) 小的数

\(n\leq10^5,\ k\leq2.5\times10^5,\ a_i\in[0,\ 2^{31})\)

贪心,堆,可持久化trie

用上一题的方法解决

令状态 \(t=(s,\ l,\ r)\) 表示左端点为 \(s\) ,右端点在 \([l,\ r]\) 中,使得区间异或值最小的右端点

现在只需考虑如何快速求出 \(t\)

先前缀和一遍, \(t=\displaystyle\max_{l\leq i\leq r}\{sum_i\oplus sum_{s-1}\}\) ,用可持久化trie,记一下每个“叶节点”的编号即可

重题 雾(

时空复杂度 \(O((n+k)\log a_i)\)

这种做法本身自带巨大常数,在bzoj卡了好一会儿常才卡过,洛谷上的只有去掉封装才能过……

然而此题有常数更小的时间复杂度 \(O((n+k)\log a_i)\) ,空间线性的做法,留坑待填……

同时还有形似的(加强版?) 与 这玩意儿的时间复杂度与 \(k\) 无关……留坑待填……

转载于:https://www.cnblogs.com/Juanzhang/p/10691752.html

你可能感兴趣的文章
django-1-新手如何使用django
查看>>
Linq 基础
查看>>
windows应用程序框架及实例
查看>>
Hibernate 对象的三种状态
查看>>
SVN提交出现“< < < < < < < .mine’无效,路径中具有非法字符”的问题
查看>>
BZOJ-4915-简单的数字题
查看>>
UVa 270 & POJ 1118 - Lining Up
查看>>
UVa 442 - Matrix Chain Multiplication
查看>>
微服务架构 SpringCloud(一)组件和概念介绍
查看>>
23种设计模式之原型模式
查看>>
Android开发指南(39) —— Testing Fundamentals
查看>>
【Unity Shader学习笔记】(五)使用鼠标绘制自由多边形(附完整工程源码)
查看>>
laravel 心得
查看>>
[LeetCode] Permutation Sequence
查看>>
Solr索引数据库数据
查看>>
关于学习编程和做好DBA的关系
查看>>
Linux编程基础——Makefile
查看>>
timus_1003_floyd_warshall
查看>>
[转]MySQL基本操作
查看>>
搜索、博客-csdn博客搜索-by小雨
查看>>