首页 > 其他分享 >浅谈一类第 k 大问题

浅谈一类第 k 大问题

时间:2024-08-24 22:48:20浏览次数:7  
标签:子串 10 浅谈 Luogu 问题 异或 一类 leqslant log

浅谈一类第 k 大问题

Introduction to K-th Largest Problems

本文介绍一类第 k 大问题的处理方法。

Luogu P1631 序列合并
Luogu P2048 [NOI2010] 超级钢琴
Luogu P5283 [十二省联考 2019] 异或粽子
CodeForces 241B Friends

基本思想:先找到部分答案,通过这部分答案更新可能的新答案。即使得当前维护的集合内一定有全局最优解,通过全局最优解更新维护的集合并保证全局最优解一定在当前维护的集合中。

Luogu P1631 序列合并

题意:给定两个长为 \(n\) 的不降数列 \(a, b\),在它们中各取一个数可以得到 \(n^2\) 个和,求最小的 \(n\) 个。\(1 \leqslant n \leqslant 10^5, 1 \leqslant a_i, b_i \leqslant 10^9\)。

发现 \(a_1 + b_1\) 一定是最小的,先将 \(a_1 + b_1\) 加入优先队列,每次弹出最小元素 \(a_i + b_j\),然后将下一次可能成为最小值的 \(a_{i + 1}, b_j\),\(a_i + b_{j + 1}\) 和 \(a_{i + 1} + b_{j + 1}\) 入队。于是队列中元素被控制在 \(O(n)\) 级别,时间复杂度 \(O(n \log n)\),可以通过。

Luogu P2048 [NOI2010] 超级钢琴

题意:给定长为 \(n\) 的数列 \(a\),求长度在 \(L\) 到 \(R\) 之间的子串的和的前 \(k\) 大值的和。\(1 \leqslant n, k \leqslant 5 \cdot 10^5, -10^3 \leqslant a_i \leqslant 10^3, 1 \leqslant L \leqslant R \leqslant n\),保证存在满足要求的子串。

处理前缀和数组 \(f\),题目即为求前 \(k\) 大的 \(f_j - f_i\)(这里用 \(i\) 代替了 \(i - 1\),便于处理)之和。

对每个位置 \(i \in [0, n - L]\),求出在 \([i + L, \min\{i + R, n\}]\) 中的 \(j\),使得 \(f_j\) 最大。这样得到的答案中一定包含全局最大的子串。

设状态 \(\{o, t, l, r\}\) 表示子串的起点为 \(o\),终点在 \([l, r]\) 之间选择,选择 \(t\) 为终点时取到最大值。

初始会将 \(\{o, t, o + l, \min\{o + R, n\}\} (o \in [0, n - L])\) 入队。每次提取出一个状态 \(\{o, t, l, r\}\) 后,将(如果合法)\(\{o, t', l, t - 1\}\) 和 \(\{o, t'', t + 1, r\}\) 入队。

于是优先队列中的元素被控制在 \(O(n + k)\) 级别,最大值用 ST 表求,可以通过。

Luogu P5283 [十二省联考 2019] 异或粽子

题意:给定长为 \(n\) 的数列 \(a\),求子串的异或和的前 \(k\) 大值的和。\(1 \leqslant n \leqslant 5 \cdot 10^5, 1 \leqslant k \leqslant 5 \cdot 10^5, 0 \leqslant a_i \leqslant 4294967295\),保证存在满足要求的子串。

处理前缀异或和数组 \(f\),题目即为求前 \(k\) 大的 \(f_j \oplus f_i\)(这里用 \(i\) 代替了 \(i - 1\),便于处理)之和。

对每个位置 \(i \in [0, n - 1]\),求出在 \([i + 1, n]\) 中的 \(j\),使得 \(f_j \oplus f_i\) 最大。这样得到的答案中一定包含全局最大的子串。

设状态 \(\{o, t, l, r\}\) 表示子串的起点为 \(o\),终点在 \([l, r]\) 之间选择,选择 \(t\) 为终点时取到最大值。

初始会将 \(\{o, t, o + 1, n\} (o \in [0, n - 1])\) 入队。每次提取出一个状态 \(\{o, t, l, r\}\) 后,将(如果合法)\(\{o, t', l, t - 1\}\) 和 \(\{o, t'', t + 1, r\}\) 入队。

于是优先队列中的元素被控制在 \(O(n + k)\) 级别,最大异或和用 0-1 Trie 求,可以通过。

CodeForces 241B Friends

本题因为 \(m\) 很大,不能套用前文所述的解法。

换一种思路:考虑把 \(a_i\) 从高位到低位插入 0-1 Trie 之后,二分第 \(m\) 大,通过第 \(m\) 大求答案。

对于二分的一个值 \(x\),枚举每个位置 \(i\),在 0-1 Trie 上找与 \(a_i\) 异或值大于等于 \(x\) 的值的个数。

类比求最大异或和的过程,考虑搜索到第 \(j\) 位。如果 \(x\) 的第 \(j\) 位为 \(1\),为了最终异或值大于等于 \(x\),可能的数一定在与 \(a_i\) 的第 \(j\) 位相异的子树中,递归即可;反之,如果 \(x\) 的第 \(j\) 位为 \(0\),与 \(a_i\) 的第 \(j\) 位相异的子树中的值一定全部满足条件,递归与 \(a_i\) 的第 \(j\) 位相同的子树即可。

于是可以在 \(O(n \log^2 w)\) 的时间内找到第 \(m\) 大的异或值(\(w\) 为值域,后文同),设这个值为 \(k\)。


下一步是求前 \(m\) 大两两异或值的和。

容易想到,类似前文所述,只需要处理被计算的完整的子树与 \(a_i\) 的异或值的和。(即搜索时找到的 \(k\) 的第 \(j\) 位为 \(0\),与 \(a_i\) 的第 \(j\) 位相异的子树)直接对这些子树的根节点打标记,整体遍历一次 0-1 Trie 时容易得到这棵子树内每一位上 \(0\) 和 \(1\) 的数量,答案也就容易统计了。

至多有 \(n \log w\) 个标记,处理每个标记需要枚举 \(\log w\) 位。同时,至多合并 \(O(n \log w)\) 次,单次合并的时间为 \(O(\log w)\)。综上,时间复杂度 \(O(n \log^2 w)\)。


将两部分拼起来就得到了最终做法,时间复杂度 \(O(n \log^2 w)\),可以通过。

Code

Luogu P1631 序列合并

Luogu P2048 [NOI2010] 超级钢琴

Luogu P5283 [十二省联考 2019] 异或粽子

CodeForces 241B Friends

标签:子串,10,浅谈,Luogu,问题,异或,一类,leqslant,log
From: https://www.cnblogs.com/bluewindde/p/18378410

相关文章

  • 线程安全是什么问题?如何引起?死锁是啥?如何解决?
    目录一、什么是线程不安全?二、如何引起的线程安全?怎么解决?1)CPU调度执行是随机的,抢占式执行(根本原因,硬件层面咱们无法干预)2)多个线程,对同一变量进行修改3)修改操作中,不是“原子”的(重点)死锁是啥,怎么引起的?  (重点)4)内存可见性5)指令重排序  总结-保证线程安全的思路......
  • 跨域解决 | 面试常问问题
    跨域解决|面试常问问题跨域问题一直是前端开发中不可避免的一部分,它涉及到浏览器的同源策略和安全机制。本文将深入解析跨域问题的本质,并探讨前端和后端的多种解决方案,同时分享一些扩展与高级技巧。最后,我们还将总结跨域解决方案的优缺点,并列出一些面试中常见的问题......
  • 解决Qt creator5..中文乱码问题
    1.工具->选项2.两种方案供选择    a.头文件(或目标文件)添加预编译指令:                #ifdefined(_MSC_VER)&&(_MSC_VER>=1600)#pragmaexecution_character_set("utf-8")#endif    b.编辑->SelectEncoding...->savewithE......
  • 怎样解决线上消息队列积压问题
    目录引言消息积压的原因解决方案Kafka消息积压引言提到消息队列,最常问到的问题就是消息积压,真实线上环境该怎么解决消息积压的问题?真实情况并不是网上说的把积压的消息投递到一个新Topic中,然后慢慢消费。这样做,成本太高、流程复杂、操作麻烦,而且还是一次性操作,不可持续,下次再出......
  • VS2022 Visual Studio Installer 一直卡在0%,或者下载速度慢的问题解决办法
    C:\Users\Administrator\AppData\Local\Temp到c盘查看日志,发现是下载一个叫vs_installer.opc的东西失败了, 直接复制日志里的https://aka.ms/vs/17/release/installer,下载,发现成功下载,然后放到installer安装器同级目录,重新打开setup安装,就成功了打开了,然后会一直正在准备中,......
  • 使用Appium执行自动化测试遇到的问题记录
    ‌Appium‌是一个开源的移动端自动化测试框架,它支持原生的、混合的以及移动端的web项目测试,并且能够测试iOS和Android应用程序。在使用中有时会遇到问题,特此记录:问题一:设备:Android一加问题描述:adb连接成功,执行测试脚本时AppiumDesktopsession报如下错误:settingsdeleteg......
  • PG数据库导致断电/重启无法正常启动问题排查
    PG数据库导致断电/重启无法正常启动问题排查一、问题数据库断电后,启动PG数据库后无法正常启动,报”psql:couldnotconnecttoserver:Nosuchfileordirectory”的错误,错误图片如下:  二、背景分析数据库是单机版,使用k8s进行部署运行在指定节点,数据目录挂服务器的指定......
  • Steam共享库被锁怎么办?Steam共享库锁定问题全面解析与解锁指南
    当Steam共享库被锁定时,玩家可能会遇到无法访问或共享游戏库的问题。以下是对Steam共享库锁定问题的全面解析与解锁指南:一、理解Steam共享库锁定的原因同步问题:可能是由于Steam客户端的同步问题导致的,例如账户状态未及时更新。账户使用冲突:如果其他家庭成员或朋友正在使用共......
  • 讨论TableLayoutPanel加载缓慢和闪烁问题解决方案
    WinForm加载多个自定义控件时,会出现很严重的闪烁问题,很卡,一块一块的加载(像打开网页时,网络很卡的那种感觉)简直没法忍受。在网上搜索了好久,网上大部分的方法是一下4种,但是都不能有效的解决问题。1、将DoubleBuffered设置true,用双缓存处理Form界面内容加载,可以提高页面显......
  • Visio 2021安装教程及相关问题和下载
    MicrosoftVisio2021是一款功能强大的图表和流程图设计工具,提供直观的方式来创建和编辑各种图表类型,如流程图、组织结构图、网络图和平面图等。作为Visio系列的最新版本,Visio2021引入了更加现代化的用户界面,使图表的定制和管理更加简便。此外,Visio2021还增加了多项智......