【DS】【AtCoder】Pakencamp 2022 Day2 H
2023.6.30 Problem Link
有 \(n\) 个帮派在打架,每个帮派有一个大小 \(a_i\),每相邻两个帮派有一个仇恨度 \(b_i\)。现在有 \(Q\) 次单点修改 \(a_i\) 或者 \(b_i\),然后给出区间 \([l,r]\),询问区间 \([l,r]\) 内的帮派打架后最后剩下的那个帮派是谁。
打架的规则是:每次选出 \(b_i\) 最大的相邻两个帮派打一架,人数较多的帮派获胜(相同则编号较小的获胜),然后败者全部加入胜者的帮派。
一个经典的值域减半思想 + 一个经典的双端点二分思想。
- 时光倒流
这个操作并不优美,考虑时光倒流,每次找到 \(b_i\) 最小的相邻帮派,然后把左边和右边较小的扔掉。
- 值域减半
注意到我们扔掉的是较小的一半,这意味着中间较大的一半会留着。于是就有这么一个类似于“不变量”的东西,只有区间的和减半的时候才会改变。如果我们每次可以“快进”到“不变量”改变的时候,就可以在 \(\log V\) 乘上快进一次的时间内解决问题。
设当前区间和为 \(X\),则我们希望找出缩小后的区间 \(\le X/2\) 的最早时刻。然后注意到,如果令 \(p\) 为最小的满足 \(\mathrm{sum}[l,p]\ge X/2\) 的点,那么不断缩小中的 \([l,r]\) 会始终包含 \(p\),直至下一步就会 \(\le X/2\) 为止,然后暴力减半一步。
- 双端点二分
我们开始“二分”这个区间 \([u,d]\)。一个区间怎么二分呢?令 \(u\) 当前的区间范围为 \([l_u,r_u]\),\(d\) 当前的区间范围为 \([l_d,r_d]\),我们希望每次“二分”将 \([l_u,r_u]\) 或者 \([l_d,r_d]\) 缩小一半。考虑找出 \(mid_u\) 和 \(mid_v\),然后分 \(\mathrm{sum}[mid_u,mid_v]\) 讨论。
如果 \(\mathrm{sum}[mid_u,mid_v]\le X/2\),此时不妨设 \(\min[mid_u,r_u]<\min[l_d,mid_d]\),那么如果在 \([l_d,mid_d]\) 中砍了一刀,那 \([mid_u,r_u]\) 之间也一定被砍了一刀,那 \(d\in[l_d,mid_d]\) 一定不合法,于是 \(d\) 可以往右边递归;
如果 \(\mathrm{sum}[mid_u,mid_v]> X/2\),此时不妨设 \(\min[l_u,mid_u]<\min[mid_d,r_d]\),那么如果在 \([l_u,mid_u]\) 中砍了一刀,那 \([mid_d,r_d]\) 之间也一定被砍了一刀,那 \(d\in[l_u,mid_u]\) 一定不合法(有些边界),于是 \(u\) 可以往右边递归。
无论如何,\(u,d\) 一定有一个可以往一边递归,所以这部分时间复杂度 \(O(\log n)\)。
总时间复杂度 \(O(n\log V\log n)\)。
【DS】【AtCoder】Pakencamp 2022 Day2 H的更多相关文章
- 【Data Structure】-NO.117.DS.1 -【Tree-23树】
[Data Structure]-NO.117.DS.1 -[Tree-23树] Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total ...
- AtCoder Beginner Contest 142【D题】【判断素数的模板+求一个数的因子的模板】
D - Disjoint Set of Common Divisors Problem Statement Given are positive integers AA and BB. Let us ...
- 【C#公共帮助类】JsonHelper 操作帮助类, 以后再也不用满地找Json了,拿来直接用
四个主要操作类:JsonConverter .JsonHelper .JsonSplit .AjaxResult 一.JsonConverter: 自定义查询对象转换动态类.object动态类转换j ...
- 数据库优化实践【MS SQL优化开篇】
数据库定义: 数据库是依照某种数据模型组织起来并存在二级存储器中的数据集合,此集合具有尽可能不重复,以最优方式为特定组织提供多种应用服务,其数据结构独立于应用程序,对数据的CRUD操作进行统一管理和控 ...
- Python开发【第二十二篇】:Web框架之Django【进阶】
Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...
- 【MyBatis源码分析】select源码分析及小结
示例代码 之前的文章说过,对于MyBatis来说insert.update.delete是一组的,因为对于MyBatis来说它们都是update:select是一组的,因为对于MyBatis来说它就是 ...
- 【C#公共帮助类】JsonHelper 操作帮助类
四个主要操作类:JsonConverter .JsonHelper .JsonSplit .AjaxResult 一.JsonConverter: 自定义查询对象转换动态类.object动态类转换js ...
- [置顶] 数据库优化实践【MS SQL优化开篇】
数据库定义: 数据库是依照某种数据模型组织起来并存在二级存储器中的数据集合,此集合具有尽可能不重复,以最优方式为特定组织提供多种应用服务,其数据结构独立于应用程序,对数据的CRUD操作进行统一管理和控 ...
- NOIP2016天天爱跑步 题解报告【lca+树上统计(桶)】
题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 nn个 ...
- (43). Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】
在上一篇我们介绍了多数据源,但是我们会发现在实际中我们很少直接获取数据源对象进行操作,我们常用的是jdbcTemplate或者是jpa进行操作数据库.那么这一节我们将要介绍怎么进行多数据源动态切换.添 ...
随机推荐
- Solon2 开发之IoC,一、注入或手动获取配置
约定 resources/app.yml( 或 app.properties ) #为应用配置文件 配置样例 track: name: xxx url: http://a.a.a db1: jdbcU ...
- JAVA PDF 截取N页,生成新文件,转图片,多个PDF 合并
JAVA PDF 截取N页,生成新文件,转图片,多个PDF 合并 <dependency> <groupId>com.itextpdf</groupId> < ...
- AudioLDM 2,加速!
AudioLDM 2 由刘濠赫等人在 AudioLDM 2: Learning Holistic Audio Generation with Self-supervised Pretraining 一 ...
- 【3rd Party】nlohmann json 基础用法
参考链接:Here 什么是nlohman json ? nlohman json GitHub - nlohmann/json: JSON for Modern C++ 是一个为现代C++(C++11 ...
- M-SOLUTIONS Programming Contest 2020 游记 (AB水题,CD模拟,E题DFS)
A - Kyu in AtCoder 水题 B - Magic 2 题意很好理解,但写的时候注意一下边界 void solve() { int a, b, c, k; cin >> a & ...
- L2-014 列车调度 (25 分)(set容器应用)
L2-014 列车调度 (25 分) 火车站的列车调度铁轨的结构如下图所示. 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道.每趟列车从入口可以选择任意 ...
- C++函数:std::tie 详解
在补CF周赛时发现dalao用了一个 tie函数和tuple类型,表示没怎么接触,现在稍微学习记录一下. tuple 即元组,可以理解为pair的扩展,可以用来将不同类型的元素存放在一起,常用于函数的 ...
- 嵌入式Linux必读经典书籍(含下载方式)
最近,在知乎看到一个问题,"嵌入式Linux有哪些好书推荐".我读研期间也喜欢收藏一些书籍,每次看到京东有活动,总是忍不住想买一些书籍回来. 随着时间越来越久,我买的书越来越多,但 ...
- RabbitMQ消息队列的发布-消费
1. 生产者 RabbitMQ_Producer static void Main(string[] args) { string path = AppDomain.CurrentDomain.Bas ...
- json 解析:marshal 和 unmarshal
Go 使用 encoding/json 包的 marshal 和 unmarshal 实现 json 数据的编解码.分别记录如下: 1. marshal 定义结构体: type OCP struct ...