251025B. 海啸

news/2025/10/26 0:16:29/文章来源:https://www.cnblogs.com/CuteNess/p/19166174

251025B. 海啸

\(n\) 个物品,物品 \(i\)\(v_i\) 的价值和 \(2^{w_i}\) 的体积。

以及 \(q\) 次修改,每次给出 \(x\) 并令 \(a_x \leftarrow a_x +1\)

每次修改后求出当总体积 \(\le V\) 时的最大总价值。

\[n\le 2\times 10^5,q\le 10^4, V\le 10^{18} \]


先考虑没有修改怎么做

\(w_i\) 相同的所有物品都在第 \(w_i\) 层。

我们先把每一层内部排序,然后考虑从小往大贪心。

对于第 \(w\) 层,假如 \(V\) 二进制下第 \(w\) 位为 \(1\),那么取出最大的价值 \(v_0\),将 \(v_0\) 累加到答案里,然后将其删去。

对于剩下的数,我们从大到小将每两个相邻的物品捆绑加入下一层。

这个过程可以归并解决。


考虑怎么带上修改?

我们从 \(w_x\) 开始依次枚举层,并考虑他造成的影响。

考虑到我们仅关心价值,不关心具体是哪个物品贡献的,我们在当前层二分找到第一个 \(\le v_x\) 的,然后将他 \(+1\)

然后我们模仿刚才的过程,将这个物品和相邻的捆绑,并在下一层二分找到对应的物品,将权值 \(+1\)

一直重复这个过程直到某一层 \(w\) 上这个价值是该层最大值,并且 \(V\) 二进制下第 \(w\) 位为 \(1\)。那么直接将答案 \(+1\),然后退出这个过程。


时间复杂度 \(\mathcal O(n\log V+q\log n\log V)\)

code
#include <iostream>
#include <algorithm>
#include <cstring>const int N = 3e5 + 7, W = 60;
typedef long long i64;
#define rep(i,a,b) for(int i(a);i<=(b);++i)namespace suki {i64 sp, ans;
int n, q, w[N], v[N];
std::basic_string<i64> g[W]; 
auto cmp = std::greater<i64>();inline void reset() { ans = 0; for(int i = 0; i < W; ++i) g[i].clear(); }inline void main() {std::cin >> n >> sp >> q;rep(i, 1, n) std::cin >> w[i] >> v[i], g[w[i]] += v[i];for(int i = 0; i < W; ++i) std::sort(g[i].begin(), g[i].end(), cmp);auto work = [&](int k) {if(k > 0) {int origs = g[k].size(), shift = sp >> (k - 1) & 1;for(int i = shift; i + 1 < (int)g[k-1].size(); i += 2)g[k] += g[k-1][i+1] + g[k-1][i];if((g[k-1].size() - shift) & 1) g[k] += g[k-1].back();std::inplace_merge(g[k].begin(), g[k].begin() + origs, g[k].end(), cmp);}if((sp >> k & 1) && !g[k].empty()) { ans += g[k][0]; }};for(int i = 0; i < W; ++i) work(i);std::cout << ans << "\n";for(; q--; ) {int x; std::cin >> x;auto modify = [](int id) {i64 val = v[id]++;for(int k = w[id]; k < W; ++k) {int p = std::lower_bound(g[k].begin(), g[k].end(), val, cmp) - g[k].begin();int shift = sp >> k & 1; g[k][p]++;if(shift && (p == 0)) { ++ans; return ; }int q = ((p - shift) ^ 1) + shift;if(0 <= q && q < g[k].size()) val += g[k][q];}};modify(x);std::cout << ans << "\n";}
}};int main() {std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);int t; std::cin >> t;for(; t--; ) { suki::reset(), suki::main(); }
}

之前见过一道相似的题,但是找不到原题了。题意如下:

给定一个大小为 \(n\) 的可重集 \(S={a_i}\)

维护以下两种操作:

  • 将第 \(l\) 大到第 \(r\) 大之间的所有数 \(+1\)

  • 询问第 \(l\) 大到第 \(r\) 大之间的所有数的和。

\[n\le 10^6 \]


我们初始先将 \(a\) 排序,然后直接按顺序放到线段树上,所以初始时整个序列是有序的。

对于一次修改操作 \([l,r]\),令 \(x=a_l,y=a_r\)\(p_0\)\(y\) 第一次出现的位置,\(p_1\)\(y\) 最后一次出现的位置。

假如我们将整个序列拆成三部分:\([1,p_0-1],[p_0,p_1],[p_1+1,n]\)

对于第一部分,我们修改的是一个后缀,所以直接在原位置上加不会破坏有序的性质。

对于中间的部分,由于值全部相同,我们可以将位于前缀的修改平移到后缀上,这个时候仍然不会破坏有序的性质。

对于最后一部分,我们没有修改,所以不会破坏有序的性质。

第一部分的最后一个数修改后 \(\le y\),中间部分的第一个数修改后 \(\ge y\),所以我们将前两段拼起来整体仍然满足有序的性质。

中间部分的最后一个数修改后 \(\le y+1\),最后一部分的第一个数 \(\ge y+1\),所以我们将后两段拼起来整体仍然满足有序的性质。

换句话说我们可以将每个修改拆成最多两个区间,使得直接在原位置上修改后整个序列仍然有序。

例如一开始的序列是 01112223334,我们希望做操作 \([4,8]\)。(011[12223]334

那么我们实际上做的区间加是:011[1222]33[3]4。加完后的结果是:01123333344


总而言之,这两个问题的维护方法,本质上都是利用了 \(+1\) 操作不会造成“交换”的性质,这使得我们直接在原位上对序列进行操作成为可能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/946523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[网络] [TCP] Linux TCP Socket 学习指南

[网络] [TCP] Linux TCP Socket 学习指南$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");ChatGPT生成(2025年10月26日00:08:46)🧠 Linux TCP Socket 学习…

[网络] [TCP] Linux UDP Socket 学习指南

[网络] [TCP] Linux UDP Socket 学习指南$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");📘 Linux UDP Socket 学习指南适合初学者理解 UDP 原理与在 Linu…

用户上下文透传机制详解

RuoYi-Cloud 用户上下文透传机制详解 引言 在微服务架构中,用户上下文的传递是一个关键问题。当一个请求在多个微服务之间调用时,如何确保用户身份信息能够正确传递到每个服务中,是实现安全认证和权限控制的基础。R…

品牌故事不会写?这个AI指令可能帮你解决大问题

本文分享了一个专业的品牌故事生成AI指令,帮助创业者和品牌负责人解决品牌叙事难题。文章提供了基础版和进阶版两个完整指令模板,通过结构化的方式指导AI生成具有情感共鸣和传播价值的品牌故事。内容包含实际使用案例…

电梯调度编程结对项目总结

电梯调度编程结对项目总结 项目地址:https://gitee.com/surrealgit/elevator_surreal.git 一、项目背景 本次课程大作业要求我们以结对编程的形式,完成一个电梯调度算法系统,包括调度算法设计、可视化界面实现、模块…

GuessGame两个版本的区别

GuessGame 两个版本的区别分析目录GuessGame 两个版本的区别分析一、控制台输出二、图形界面2.1 抽象类的好处三、两者对比四、总结 一、控制台输出 控制台版本的ConsoleGame是最基础、最传统的程序交互方式,它通过标…

第二次作业--田佳吉

https://gitee.com/tian-jiaji/qunqing.git

电脑频繁卡顿?4个CMD命令揪出后台隐藏进程

电脑频繁卡顿?4个CMD命令揪出后台隐藏进程电脑频繁卡顿?4个CMD命令揪出后台隐藏进程 你以为电脑卡顿只是垃圾太多?警惕!70%的后台异常进程都藏着“数字内鬼”——可能是黑客植入的隐蔽程序,正偷偷上传你的代码、文…

Graphiti:为智能体构建实时知识图谱,引领更聪明的 AI 时代

我一直觉得很神奇:大多数 AI 系统只要你一停止和它们对话,就会把一切都忘光。你喂给它们 facts、context、chat logs——会话一结束,噗的一下,全没了。这一直是“intelligent” agents 的最大瓶颈。 后来我发现了 …

2025_软件工程师课程辅导

第一周 课程内容 核心教学内容 App Inventor入门实践 使用工具App Inventor网站:http://ai2.17coding.net/AI伴侣手机应用应用相关素材从百度网盘下载上述工具软件和应用素材,如下图所示:课程案例Hello,小蜜蜂!画…

初学Claude Skills/Agents/Plugins功能

初学Claude Skills/Agents/Plugins功能目录SkillsSkills 的关键特点Skills的结构建立不同的 Skills个人 Skills项目 Skills插件 Skills编写 SKILL创建SKILL.md 文件Skills 如何工作学习网址AgentsPlugins Anthropic 刚…

《《《es相关

es 修改思路 一:新建索引 1.新建立索引 addIndex 为ik_smart 二: es 查询 1.es分页是从0开始.分页开始页-1,和结束页-1 2.addIndex 为 ik_smart(分词没有那么细,一般情况可以用这个)每天多努力一点,你将会变得更…

人资新手必看,企业绩效的意义

绩效考核管理是牵引整个企业行动方向的关键 其意义在于: 一、是有利于人事决策,通过绩效考核识别核心人才,对其加以培训、委以重任,同时能够根据员工特长决定人员调配和升降。 二、是确定合理的薪酬水平。根据员工的…

初学Claude Skills Agents功能

初学Claude Skills Agents功能目录SkillsSkills 的关键特点Skills的结构建立不同的 Skills个人 Skills项目 Skills插件 Skills编写 SKILL创建SKILL.md 文件Skills 如何工作学习网址Agents Anthropic 刚刚为 Claude 推出…

题解:P14309 【MX-S8-T2】配对

前言:考场上看出来了某关键性质结果发现做不下去了,然后就寄了。最后因为代码全部加了文件操作荣获总分 0 分的优异成绩。这种题需要我们多加猜测性质并辅以证明。 性质 #1 我们先不考虑任何修改操作。 一个子树内的…

HuggingFace 库使用小技巧

有时在处理数据的时候,我们在数据处理函数内部添加调试语句但是却没有输出,这可能是因为:数据被缓存了,令overwrite_cache: true即可,这样就会重新调用数据处理函数处理数据(一般在调试的时候使用)

【ArcMap】复制选中的线并将其上移一段距离

首先选中需要复制的线 在python2窗口中输入以下代码:此处为上移10米对于地理坐标系,使用0.00009度(约10米)对于投影坐标系,使用10米# -*- coding: utf-8 -*- import arcpy import os import sys# 重新加载sys并设…

启动分布式mapreduce的过程以及prompt

打开docker desktop,启动5个节点 用VS Code连接到第一个节点 为每个节点打开SSH服务service ssh start 每个节点运行cd /usr/local/hadoop-3.4.0/sbin && ./stop-all.sh && rm -rf /usr/local/hadoop…

记一次thinkphp3.2项目迁移失败的原因。 is currently unable to handle this request. HTTP ERROR 500

项目迁移到别的服务器后报错如下 This page isn’t working xxxx is currently unable to handle this request. HTTP ERROR 500这个问题是关闭了错误显示,不能看到明显的错误 打开php.ini文件 display_errors = Off …

20232310 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 1.1回答问题 (1)杀软是如何检测出恶意代码的? 将文件二进制代码与病毒库中的已知恶意特征对比,若匹配则判定为威胁。 分析代码结构和行为逻辑,例如检查是否调用危险API、是否存在异常注册表操作或加密…