【做题纪要】10月“我想要太多太多装满房子,欢乐自由每刻每时” -- 《我想要太多太多》
[AGC006D] Median Pyramid Hard
看了一圈感觉就这题比较可做,那就先写这个,但是还是没啥头绪。
首先看咋写,这题的暴力肯定是直接从第 层开始反推就行的,但是复杂度好像很劣的样子,这肯定不行
考虑二分答案,我们二分塔顶的值,如果比这个点大我们就设为 ,如果比这个点小我们就设为
我们发现如果有两个相同的值挨在一起,那么它就会一直一直往上走
如果完全没任何相邻的那就一直是 ,这个明显比较神秘
复杂度 完全能过
代码写的挺神秘的
注意到我写完的代码有唐诗错误,for_(i,1,n) a[i]=read();
处应该写 for_(i,1,2*n-1)
「JOI 2017 Final」焚风现象
这题似乎很优的样子,话说 JOI 是日本的 NOI 吗
考虑每次修改实际上对于区间内部和区间的非相邻格子没有影响,只对其相邻的两个格子有影响
因此我们可以先对于最开始的区间进行暴力计算,然后对于修改使用线段树维护
但是请看这条
没错,这题不需要线段树,直接暴力维护两点即可
那就解决了,我服了白打了个线段树
「JOI 2014」水筒
这题咋连个输入格式和输出格式都没有,急了,这我咋写啊,LOJ救我,不过咋又是JOI,JOI这么能出题吗
发现这是一个图论的题,看起来挺优秀的
考虑对于这样的一个图去打邻接矩阵,然后跑 MST,这是很明显的,对于每一条边的长度直接多源 bfs 去求即可,然后跑克鲁斯卡尔或者perm来重构这个图,去建立一棵树就行
最后跑一个树剖或者 lca 就行,由于机房里有 lca 所以考虑使用 lca 来求两点之间距离
然后就过了
P5044 [IOI2018] meetings 会议
我打 IOI2018 D2T3?真的假的?要上吗?
这题是 lca 上课讲的,我也就直接直接半途离线了,只能回来补了,悲
题意:给定长为 的序列 ,有 次询问,每次询问在 内找一个点 ,使得 内每个点到 之间最大值的和(即 )最小。 。
注意到这道题是区间问题,考虑区间 DP,用区间中的最大值将区间分为两部分时,分类讨论开会点在最大值的左边或右边
我们知道,开会点不可能在最大值这里,因为这个肯定是不满足最优秀的
设 表示表示区间 中所有人参会的最小代价,其中最高点为
转移方程如下,这个看起来就很优,但是状态是 的过不去
似乎优化不下去啊,这咋办。不慌,我们可以用笛卡尔树维护
现在我们将任意一个区间特化为了子树树根上的前后缀查询,考虑重设 DP 状态。
我们设 表示 子树内从最左端到 号结点这段区间内所有人开会的最小总代价, 表示 子树内从 号结点到最右端这段区间内所有人开会的最小总代价。
如果 ,是左区间的子问题。
如果 ,多增加了一个点的代价,最高峰到左区间,代价恒为 。
如果 ,需要分讨:开会点在左侧或开会点在右侧。
- 开会点在左侧,右侧所有点前往开会点必经最高峰,每个点贡献为 。
- 开会点在右侧,左侧所有点前往开会点必经最高峰,每个点贡献为 。
可以把 DP 数组放到线段树上,然后 的情况就可以通过继承和单点赋值快速更新,但是 操作有取最值操作,无法快速更新
有一个很重要的性质: 越小,开会点在左侧所需代价一定越来越小, 越大,开会点在右侧所需代价也一定越来越小,拥有单调性。
二分找到这两条一次函数的交点,交点之前使用左侧的 DP 方程更新,交点之后使用右侧的 DP 方程更新。
P6717 [CCO2018] Boring Lectures
问题相当于求两个距离不大于 的数对的和的最大值
我们把修改改为先删除再进行插入的操作,对于插入操作我们使用线段树在左端点维护每个区间的答案
维护区间最大的最大值+次大值,区间最值即可更新答案。
咋删?不好删,那么就不删,直接离线然后线段树分治即可
P4581 [BJOI2014] 想法
...?这啥神秘题目
一眼考虑随机化,这不随机化还能咋做,毕竟只需要以比较高的概率回答的比较准确即可。
我们首先考虑给每个入度为 的点都随机赋予一个权值,,求出每个点能够返回到的入度为 的点的最小权值,
权值的期望是 。
容易发现单次求的复杂度是 的,我们直接暴力求很多次然后取平均值即可。
李华与变色龙
注意到 ,向左走的变色龙遇到向右走的变色龙后认为是变成了 ,而向右走的变色龙颜色不变。
我们从右往左枚举每一只向右的变色龙,设两只中间的距离为 ,则答案(每个颜色)都要加上 ,其中 为颜色 的向左的变色龙初始位置在当前枚举的向右的变色龙右边的数目。
这样复杂度 可以通过。
笑熬浆糊
咕了先
饼干
容易发现无解当且仅当有一项大于总和的一半或者总和为奇数
找到众数去优先消,同时保证解的存在性不被破坏即可,可以通过本题
狂人日记
打表找规律发现 ,注意到 时答案为 , 为任意整数。问题转化为求 中 popcount 为 的 的数量,枚举 和 的 LCP,这样的 有 个
倒卖文物
妈的这题面诗人握诗,出题人自己看得懂吗
设 表示前 种货币和为 的方案数,设第 种货币的面值为
可以发现一个性质:
- 如果 则 用不到
因此我们设 表示
我们让 表示 最后一个非零的 则 ,可以直接计算
这里需要证明,过程我不写了太墨迹
Constrained Nim
显然是博弈论,显然要用 SG 函数,没有限制的话显然对于 。
那么加上限制之后会有若干个特殊点和若干段 的一次函数。
没有限制的点值是前面的最大值加 ,而有限制的点可以考虑维护每个 的出现次数,不断删掉被禁止的 ,找到最小的删没了的 就是当前的 SG 值。
直接维护 不行吗,但发现只维护特殊点的就行,其他地方均为 。
汉谟拉比
虽然朴素分组背包理论不可过,但是卡常可过。
P10218 [省选联考 2024] 魔法手杖
魔怔题
看到最大化,想到贪心
从高到低确定每一位,首先决定这一位能不能是 ,同时维护变量 和 。
对于 只考虑已经决策过的位 或 确定它到底属于 还是 ,剩下的是 的,可以发现这一部分在 trie 树上是一棵子树,递归求解。
假设当前是 ,下一位 选择 , 也选择 ,则 右子节点全部需要加到 里面,需要判断 的和是否超过 ,左子节点也需要递归解决,判断最坏情况下是否有解,即 剩下的位都是 , 剩下的位都是 是否满足 。
选择 的情况是对称的,如果 下一位不可能选择 ,那就只有选择 ,
这个时候当 的时候, 的左子树可以直接加入 ,右子树需要递归求解, 同理。
回転寿司
区间操作还有超大时限考虑分块。
观察发现一次询问的答案一定是 内的最大值
考虑分块,为每个块都维护大根堆,遇到块时将 加入当前块的堆,再将 设为堆内最大值并弹出。
对于散块同时为每个块再维护一个小根堆代表块内询问的数,暴力重构堆即可。
取 即可,可以通过