首页 > 其他分享 >做题笔记✍

做题笔记✍

时间:2023-06-30 16:46:43浏览次数:40  
标签:二分 log sum mid 笔记 帮派 区间

AtCoder

Others

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\) 最大的相邻两个帮派打一架,人数较多的帮派获胜(相同则编号较小的获胜),然后败者全部加入胜者的帮派。


一个经典的值域减半思想 + 一个经典的双端点二分思想。

  1. 时光倒流

这个操作并不优美,考虑时光倒流,每次找到 \(b_i\) 最小的相邻帮派,然后把左边和右边较小的扔掉。

  1. 值域减半

注意到我们扔掉的是较小的一半,这意味着中间较大的一半会留着。于是就有这么一个类似于“不变量”的东西,只有区间的和减半的时候才会改变。如果我们每次可以“快进”到“不变量”改变的时候,就可以在 \(\log V\) 乘上快进一次的时间内解决问题。
设当前区间和为 \(X\),则我们希望找出缩小后的区间 \(\le X/2\) 的最早时刻。然后注意到,如果令 \(p\) 为最小的满足 \(\mathrm{sum}[l,p]\ge X/2\) 的点,那么不断缩小中的 \([l,r]\) 会始终包含 \(p\),直至下一步就会 \(\le X/2\) 为止,然后暴力减半一步。

  1. 双端点二分

我们开始“二分”这个区间 \([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)\)。

标签:二分,log,sum,mid,笔记,帮派,区间
From: https://www.cnblogs.com/Charlie-Vinnie/p/17515938.html

相关文章

  • 【js学习笔记十四】普通函数中的this指向问题解决方案_this
     目录前言导语 解决思路运行结果前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语歌谣歌谣......
  • 【js学习笔记十五】普通函数中的this指向问题解决方案箭头函数
     目录前言导语 解决思路运行结果前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语歌谣歌谣......
  • 《重构》7-12章读书笔记
    《重构》7-12章读书笔记重构手法介绍每个手法通常包含三个模块:时机(遇到什么情况下使用)、做法(详细步骤的概括)、关键字(做法的缩影)提炼函数时机:当我们觉得一段大函数内某一部分代码在做的事情是同一件事,并且自成体系,不与其他掺杂时当代码展示的意图和真正想做的事情不是同一......
  • node 笔记
    #node笔记##安装去node官网下载LTS,长期支持版本,傻瓜式安装打开命令行```shellnode-v```如果能出现版本号,即安装成功如果不出现,再安装一次,可以考虑选择repair备注:win7用户,需要自行配置环境变量##配置淘宝镜像```shellnpmgetregistry```如果出现的网址,不是https://registry.......
  • node笔记
    安装去node官网下载LTS,长期支持版本,傻瓜式安装打开命令行node-v如果能出现版本号,即安装成功如果不出现,再安装一次,可以考虑选择repair备注:win7用户,需要自行配置环境变量配置淘宝镜像npmgetregistry如果出现的网址,不是https://registry.npmmirror.com/则需要改成淘宝......
  • git笔记
    1、添加第一步:用gitbushhere打开需要上传的文件夹gitinit初始化本地仓库,这个时候会生成一个.git文件夹,说明初始化成功了。第二步:打开.git文件夹下的config文件,输入你的用户名和邮箱。[user] name=@blueskyfan [email protected]第三步:找到你的g......
  • sql注入笔记(二)
    sql-labs篇union注入#Less-011.打开环境32.先查两个值看看?id=1?id=23.判断是否存在注入,使用一些符号进行判断,利用错误信息?id=2'发现报错,语法错误,“syntaxtousenear"2"LIMTatline1”,意思是在2附近有错误,也就是我们输入id=2'的时候与查询语句的闭合......
  • C语言学习笔记:1~10章---基本知识
    基本知识2023-06-2923:14:18 1#include<stdio.h>2intmain(void)/*asimpleprogram*/3{4intnum;/*defineavariablecallednum*/5num=1;/*assignavaluetonum......
  • celery笔记九之task运行结果查看
    本文首发于公众号:Hunter后端原文链接:celery笔记九之task运行结果查看这一篇笔记介绍一下celery的task运行之后结果的查看。前面我们使用的配置是这样的:#settings.pyCELERY_RESULT_BACKEND="redis://localhost/1"是将task的运行结果保存在redis的第二个数据......
  • C语言笔记
    C语言学习笔记linux常用指令pwd:查看当前路径cd:进入某个文件夹cd文件夹名cd..——返回上一级cd/——进入根目录cd/home/——进入到相对目录cd~——进入到当前用户......