【做题纪要】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\)

\[f_{l,r} = \min\{f_{l,x-1}\ + (r-x+1) \times h_x\ \ ,\ \ f_{x+1,r} + (x-l+1) \times h_x\} \]

转移方程如下,这个看起来就很优,但是状态是 \(O(n^2)\) 的过不去

似乎优化不下去啊,这咋办。不慌,我们可以用笛卡尔树维护

现在我们将任意一个区间特化为了子树树根上的前后缀查询,考虑重设 DP 状态。

我们设 \(f_{x,i}\) 表示 \(x\) 子树内从最左端到 \(i\) 号结点这段区间内所有人开会的最小总代价, \(g_{x,i}\) 表示 \(x\) 子树内从 \(i\) 号结点到最右端这段区间内所有人开会的最小总代价。

如果 \(i \in [L,x-1]\),是左区间的子问题。

\[\large f_{x,i} = f_{ls_x,i} \]

如果 \(i = x\),多增加了一个点的代价,最高峰到左区间,代价恒为 \(h_x\)

\[\large f_{x,i} = f_{ls_x,x-1} + h_x \]

如果 \(i \in [x+1,R]\),需要分讨:开会点在左侧或开会点在右侧。

  • 开会点在左侧,右侧所有点前往开会点必经最高峰,每个点贡献为 \(h_x\)

\[\large f_{x,i} = f_{ls_x,x-1} + (i-x+1) \times h_x \]

  • 开会点在右侧,左侧所有点前往开会点必经最高峰,每个点贡献为 \(h_x\)

\[\large f_{x,i} = f_{rs_x,i} + (x-l+1) \times 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)\) 可以通过。

Luogu Submission .

笑熬浆糊

咕了先

饼干

容易发现无解当且仅当有一项大于总和的一半或者总和为奇数

找到众数去优先消,同时保证解的存在性不被破坏即可,可以通过本题

狂人日记

打表找规律发现 \(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} $ 个

倒卖文物

妈的这题面诗人握诗,出题人自己看得懂吗

image

\(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}\) 即可,可以通过

P2490 [SDOI2011] 黑白棋

posted @ 2024-10-04 20:16  Vsinger_洛天依  阅读(99)  评论(13编辑  收藏  举报