【做题纪要】10月“我想要太多太多装满房子,欢乐自由每刻每时” -- 《我想要太多太多》
[AGC006D] Median Pyramid Hard
看了一圈感觉就这题比较可做,那就先写这个,但是还是没啥头绪。
首先看咋写,这题的暴力肯定是直接从第 \(n\) 层开始反推就行的,但是复杂度好像很劣的样子,这肯定不行
考虑二分答案,我们二分塔顶的值,如果比这个点大我们就设为 \(1\),如果比这个点小我们就设为 \(0\)
我们发现如果有两个相同的值挨在一起,那么它就会一直一直往上走
如果完全没任何相邻的那就一直是 \(0\),这个明显比较神秘
复杂度 \(O(n \log n)\) 完全能过
代码写的挺神秘的
注意到我写完的代码有唐诗错误,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 上课讲的,我也就直接直接半途离线了,只能回来补了,悲
题意:给定长为 \(n\) 的序列 \(h\),有 \(q\) 次询问,每次询问在 \([l,r]\) 内找一个点 \(x\),使得 \([l,r]\) 内每个点到 \(x\) 之间最大值的和(即 \(\sum\limits_{i=l}^x\max\limits_{j=i}^xh_j+\sum\limits_{i=x+1}^r\max\limits_{j=x}^ih_j\))最小。\(n,q\leqslant 750000,h\leqslant 10^9\) 。
注意到这道题是区间问题,考虑区间 DP,用区间中的最大值将区间分为两部分时,分类讨论开会点在最大值的左边或右边
我们知道,开会点不可能在最大值这里,因为这个肯定是不满足最优秀的
设 \(f_{l,r}\) 表示表示区间 \([l,r]\) 中所有人参会的最小代价,其中最高点为 \(x\)
转移方程如下,这个看起来就很优,但是状态是 \(O(n^2)\) 的过不去
似乎优化不下去啊,这咋办。不慌,我们可以用笛卡尔树维护
现在我们将任意一个区间特化为了子树树根上的前后缀查询,考虑重设 DP 状态。
我们设 \(f_{x,i}\) 表示 \(x\) 子树内从最左端到 \(i\) 号结点这段区间内所有人开会的最小总代价, \(g_{x,i}\) 表示 \(x\) 子树内从 \(i\) 号结点到最右端这段区间内所有人开会的最小总代价。
如果 \(i \in [L,x-1]\),是左区间的子问题。
如果 \(i = x\),多增加了一个点的代价,最高峰到左区间,代价恒为 \(h_x\)。
如果 \(i \in [x+1,R]\),需要分讨:开会点在左侧或开会点在右侧。
- 开会点在左侧,右侧所有点前往开会点必经最高峰,每个点贡献为 \(h_x\)。
- 开会点在右侧,左侧所有点前往开会点必经最高峰,每个点贡献为 \(h_x\)。
可以把 DP 数组放到线段树上,然后 \(i_1,i_2\) 的情况就可以通过继承和单点赋值快速更新,但是 \(i_3\) 操作有取最值操作,无法快速更新
\(i_3\) 有一个很重要的性质:\(i\) 越小,开会点在左侧所需代价一定越来越小,\(i\) 越大,开会点在右侧所需代价也一定越来越小,拥有单调性。
二分找到这两条一次函数的交点,交点之前使用左侧的 DP 方程更新,交点之后使用右侧的 DP 方程更新。
P6717 [CCO2018] Boring Lectures
问题相当于求两个距离不大于 \(k\) 的数对的和的最大值
我们把修改改为先删除再进行插入的操作,对于插入操作我们使用线段树在左端点维护每个区间的答案
维护区间最大的最大值+次大值,区间最值即可更新答案。
咋删?不好删,那么就不删,直接离线然后线段树分治即可
P4581 [BJOI2014] 想法
...?这啥神秘题目
一眼考虑随机化,这不随机化还能咋做,毕竟只需要以比较高的概率回答的比较准确即可。
我们首先考虑给每个入度为 \(0\) 的点都随机赋予一个权值,,求出每个点能够返回到的入度为 \(0\) 的点的最小权值,
权值的期望是 \(\frac{\text{随机值域}}{k+1}\)。
容易发现单次求的复杂度是 \(\text O(n+m)\) 的,我们直接暴力求很多次然后取平均值即可。
李华与变色龙
注意到 \(k\le 40\),向左走的变色龙遇到向右走的变色龙后认为是变成了 \((a+b)\bmod k\),而向右走的变色龙颜色不变。
我们从右往左枚举每一只向右的变色龙,设两只中间的距离为 \(val\),则答案(每个颜色)都要加上 \(\frac{val}{2}\times a_i\),其中 \(a_i\) 为颜色 \(i\) 的向左的变色龙初始位置在当前枚举的向右的变色龙右边的数目。
这样复杂度 \(O(nk)\) 可以通过。
笑熬浆糊
咕了先
饼干
容易发现无解当且仅当有一项大于总和的一半或者总和为奇数
找到众数去优先消,同时保证解的存在性不被破坏即可,可以通过本题
狂人日记
打表找规律发现 \(q(n)=2^k-1\),注意到 \(t \not = 2^s-1\) 时答案为 \(0\),\(s\) 为任意整数。问题转化为求 \([1,m]\) 中 popcount 为 \(s\) 的 \(x\) 的数量,枚举 \(x\) 和 \(m\) 的 LCP,这样的 \(x\) 有 $\binom {n-j} {s-i} $ 个
倒卖文物
妈的这题面诗人握诗,出题人自己看得懂吗
设 \(f_{i,j}\) 表示前 \(i\) 种货币和为 \(j\) 的方案数,设第 \(i+1\) 种货币的面值为 \(d_i\)
可以发现一个性质:
- 如果 \(j\not = m \pmod d_i\) 则 \(j\) 用不到
因此我们设 \(g_{i,j}\) 表示 \(f_{i,\{m \bmod b_i\}+jd_i}\)
我们让 \(t_i\) 表示 \(g_{i,j}\) 最后一个非零的 \(j\) 则 \(\sum t\le 20\sum b\),可以直接计算
这里需要证明,过程我不写了太墨迹
Constrained Nim
显然是博弈论,显然要用 SG 函数,没有限制的话显然对于 \(SG(x_i)=x_i\)。
那么加上限制之后会有若干个特殊点和若干段 \(y=x+k\) 的一次函数。
没有限制的点值是前面的最大值加 \(1\),而有限制的点可以考虑维护每个 \(SG(x)\) 的出现次数,不断删掉被禁止的 \(x\),找到最小的删没了的 \(SG(x)\) 就是当前的 SG 值。
直接维护 \(SG(x)\) 不行吗,但发现只维护特殊点的就行,其他地方均为 \(1\)。
汉谟拉比
虽然朴素分组背包理论不可过,但是卡常可过。
P10218 [省选联考 2024] 魔法手杖
魔怔题
看到最大化,想到贪心
从高到低确定每一位,首先决定这一位能不能是 \(1\),同时维护变量 \(ans\) 和 \(x\)。
对于 \(a_i\) 只考虑已经决策过的位 \(a_i\ \text{xor}\ x\) 或 $ >ans$ 确定它到底属于 \(S_1\) 还是 \(S_2\),剩下的是 \(=ans\) 的,可以发现这一部分在 trie 树上是一棵子树,递归求解。
假设当前是 \(u\),下一位 \(ans\) 选择 \(1\),\(x\) 也选择 \(1\),则 \(u\) 右子节点全部需要加到 \(S_1\) 里面,需要判断 \(b\) 的和是否超过 \(m\),左子节点也需要递归解决,判断最坏情况下是否有解,即 \(x\) 剩下的位都是 \(1\),\(ans\) 剩下的位都是 \(0\) 是否满足 \(\min_{a \in S_1}\{a+x\} \ge ans\)。
\(x\) 选择 \(0\) 的情况是对称的,如果 \(ans\) 下一位不可能选择 \(1\),那就只有选择 \(0\),
这个时候当 \(x=1\) 的时候,\(u\) 的左子树可以直接加入 \(S_2\),右子树需要递归求解,\(x=0\) 同理。
回転寿司
区间操作还有超大时限考虑分块。
观察发现一次询问的答案一定是 \([l,r]\) 内的最大值
考虑分块,为每个块都维护大根堆,遇到块时将 \(A\) 加入当前块的堆,再将 \(A\) 设为堆内最大值并弹出。
对于散块同时为每个块再维护一个小根堆代表块内询问的数,暴力重构堆即可。
取 \(B = \sqrt{n}\) 即可,可以通过