2024 暑假多校 做题记录

代码链接

HDU7445 鸡爪

可以发现容易构造出 \(\lfloor\frac{n}{3}\rfloor\) 的上界。

对于字典序,只要考虑 \(n\)\(3\) 的倍数的情形(对于 \(n\) 不是 \(3\) 的倍数的情形,只要将余出边的左端点设为 \(1\) 即可)。

因为要求字典序最小,自然考虑节点 \(1\) 最多能连多少条边,而 \(n\)\(3\) 的倍数意味着每条边都属于一个鸡爪。

如果节点 \(1\) 属于一个鸡爪,则 \(1\) 能多连 \(3\) 条边;对于剩下的 \(\frac{n}{3}-1\) 个鸡爪,每个最多有一条边与节点 \(1\) 相连。

所以最多可以将节点 \(2\sim\frac{n}{3}+3\) 与节点 \(1\) 相连,并且其中有 \(\frac{n}{3}-1\) 个鸡爪点和 \(3\) 个非鸡爪点。

如果节点 \(2\) 是鸡爪点,则能再连 \(\frac{n}{3}+1\) 条边,这时节点 \(3\) 和剩下点连边,可以验证这样的构造是合法的。

HDU7446 梦中的地牢战斗

可以把伤害看成扣除金币。

设状态 \(f(i,j,k)\) 表示在 \((i,j)\) 怪物存活状态为 \(k\) 时能获得的最多金币, 那么问题就是求 DAG 上的单源最短路。

状态数 \(O(nm2^K)\),转移需要预处理做到 \(O(1)\).

HDU7464 比特跳跃

首先 \(\max(x,y) \leq x|y \leq x+y\),所以 \(x|y \leq (x|z)+(z|y)\).

这两个式子告诉我们除了从 \(1\) 出发的跳跃只要考虑一次满足 \(x|y = y\) 的跳跃.

以这一次比特跳跃 \(x \to y\) 为分界点,则前面是 \(1 \to x\) 的最短路,后面是 \(y \to s\) 的最短路(\(s\) 为终点).

于是我们先把从 \(1\) 出发的跳跃加到边集,跑一次单源最短路,然后做一次从子集转移的 sosdp,最后再跑一遍单源最短路.

HDU7467 抓拍

我们令 \(a\) 表示方向为东的最大 \(x_i\)\(b\) 表示方向为西的最大 \(x_i\)\(c\) 表示方向为南北的最大 \(x_i\).

则在时间 \(t\) 的右端点 \(f(t)=\max(a+t,b-t,c)\).

类似地,我们最后能得到在时间 \(t\) 的周长 \(C(t) = \max(a+t,b-t,c)-\min(d+t,e-t,f)+\max(g+t,h-t,i)-\min(j+t,k-t,l)\).

可以发现 \(C(t)\) 的图像是几段直线构成的,我们一定可以在 \(t = 0\) 或者最值函数的参数取等时取到极值.

HDU7457 深度自同构

\(f(n)\) 为含有 \(n\) 个点的深度自同构的无编号有根树森林个数,\(g(n)\) 为含有 \(n\) 个点的深度自同构的无编号有根树个数.

注意到深度自同构的有根树去掉根节点即为深度自同构的森林,所以 \(f(n) = g(n-1)\).

设森林有 \(d\) 棵树,那么它对 \(f(n)\) 的贡献就是 \(g(\frac{n}{d})\).

所以 \(f(n) = \sum_{d \mid n} g(\frac{n}{d}) = \sum_{d \mid n}f(d-1)\).

\(f(d-1)\) 更新 \(f(dk)\) 即可做到 \(O(n\log n)\).

牛客多校3A Bridging the Gap 2

容易求每个人能贡献的最大耐力值 \(w_i\) 和所有人过河需要消耗的最小总耐力值 \(W\)

可以证明,每个人能过河等价于 \(\sum w_i \geq W\).

牛客多校3J Rigged Games

先求出从每个点开始的小局结束的状态,然后求从每个点开始的大局结束的状态.

朴素的一步一步转移的做法可以用倍增加速.

牛客多校4C Sort4

一次 Sort4 可以解决两个大小为 \(2\) 的环或者一个大小为 \(3\)\(4\) 的环或者把一个大小大于 \(4\) 的环的大小减少 \(3\).

HDU7475 序列更新

对于每次更新,我们既可以枚举 \(a_i\) 也可以枚举 \(b_i\).

初始的 \(a_i\) 可以看做全 \(0\) 序列,考虑使 \(a_i>b_{n-x}\) 的期望次数为 \(\sum(1-\frac{x}{n})^i < \frac{n}{x}\).

对于每一次更新,将 \(\leq b_{n-x}\)\(a_i\) 枚举判断是否更新,而 \(> b_{n-x}\)\(a_i\) 只要通过枚举 \(b_{n-x+1}\sim b_n\) 来更新.

于是我们的期望更新次数是 \(O(\frac{n^2}{x}+qx)\),因为 \(n,q\) 同阶,当 \(x\)\(\sqrt n\) 时可以做到 \(O(n\sqrt n)\).

HDU7471 最优 K 子段

二分答案.

这样就可以贪心地选择右端点最小的大于等于答案的子段.

可以先通过前缀和的大小正常维护 \(\left\{[j,i)\right\} _{j=1}^{i-1}\) 构成的优先队列.

根据素数密度,我们在子段和大于等于答案的子段里只要判断 \(O(\log n)\) 次就能找到一个素数长度的子段.

HDU7491 开关灯

通过打表容易找到结论,下面给出证明过程:

首先反转 \(1\),得到 xxo,然后反转 \(2\),得到 oox;然后反转 \(4\),得到 oooxx,然后反转 \(5\) 得到 ooooox.

重复上述过程,可以得到一个将 \(3k\) 单独反转的新操作.

\(n\bmod 3= 0\) 时,从反向重复上述过程就能得到将 \(3k-2\) 单独反转的操作,然后就能得到单独反转 \(3k-1\) 的操作,于是可以得到所有状态.

\(n \bmod 3 = 1\) 时,反向得到 \(3k-1\) 单独反转的操作,进而能得到单独反转 \(3k-2\) 反转的操作,于是可以得到所有状态.

\(n \bmod 3 = 2\) 时,考虑构造与 \(n-1\) 个开关状态的双射.

对于 \(n-1\) 的开关构成的每一个状态 \(s\),在 \(n\) 个开关下重复其操作过程,于是就能得到 \(s+a_n\) 的状态,而对于每一个 \(s\)\(a_n\) 是确定的.

接下来能做的只有反转 \(a_n\) 这个操作,只要证明 \(s\) 单独反转 \(a_{n-1}\) 后形成的状态对应的 \(a_n'\)\(a_n\) 不同.

考察在 \(n-1\) 的状态下改变 \(a_{n-1}\) 的过程,我们是通过单独反转 \(a_{n-3}\)\(a_{n-2}\) 然后反转 \(a_{n-2}\) 来反转 \(a_{n-1}\) 的,考察单独反转 \(a_{n-3}\) 的过程,即先反转 \(a_{n-1}\),再反转 \(a_{n-2}\),其中 \(a_n'\) 反转了一次,所以与 \(a_n\) 不同.

牛客多校4H Yet Another Origami Problem

先将 \(\left\{a_i\right\}\) 排序,折痕长度就是 \(\left\{a_i - a_0\right\}\).

可以找张纸折一下.

对于两个分别长 \(x,y\) 的折痕,可以得到长度为 \(x \bmod y\) 的折痕,于是可以得到长度 \(\gcd\left(x,y\right)\) 的折痕.

所以最短的折痕长度就是 \(\gcd_{i=0}^{n-1} (a_i-a_0)\).

牛客多校4F Good Tree

设两点为 \(u,v\),树一定是这种结构 \(\rhd\!\!\!\bigcirc \!\!\!\!\!u \!-\!\!\bigcirc\!\!\!\!\!\underset{\triangle}\!\!-\cdots-\!\!\bigcirc\!\!\!\!v \!\!\lhd\),设 \(u\) 左边的子树大小为 \(a\)\(v\) 右边的子树大小为 \(b\).

那么 \(x = dis(u,v)|a-b|+\sum\limits_{w \in S}(dis(u,v)-2k)\),其中 \(S\)\(u,v\) 路径上点子树中的非根结点的集合.

\(dis(u,v)=A,|a-b|=B,|S|=C\),答案就是 \(A+B+C+1\).

容易确定下界,奇偶性需要精细讨论.

\(d^2\leq x <(d+1)^2\),如果 \(x=d^2\),那么 \(2d+1\) 是下界同时可以取到(\(A=B=d\)).

如果 \(d^2<x\leq d(d+1)\),此时 \(2d+2\) 是下界且在 \(d(d+1)-x \equiv x\equiv 0 \pmod 2\) 容易取到(\(A=B=d,C=1\)),否则 \(x\) 是奇数,那么要想取到这个下界,\(A,B\) 要么是一奇一偶,此时 \(C\) 为偶数,\(x\) 为偶数矛盾,要么同奇偶性,此时 \(C\) 为奇数,\(x\) 为奇数矛盾. 所以下界只能为 \(2d+3\),此时可以让 \(C\)\(2\)\(A,B\) 同取 \(d\) 或者取 \(d+1,d-1\).

如果 \(d(d+1)<x<(d+1)^2\),下界是 \(2d+3\),并且 \(A,B\)\(d+1,d\)\(d,d+1\)\(C\)\(1\) 即可.

HDU7486 猫罐头游戏

通过打表可以找到规律.

先观察 \(3\) 堆罐头数量全是奇数的情况,小小猫只能变成二奇一偶,勇者猫选择把偶数变成分解为两个奇数又能得到三个奇数的情况,所以三个都是奇数的情况是必败的.

都是奇数可以推广到 \(\rm lowbit\) 全相同的情况,因为 \(\rm lowbit\) 不同的选择 \(\rm lowbit\) 最大的可以分解为两个 \(\rm lowbit\) 相同的罐头. 而 \(\rm lowbit\) 全相同无法再变成 \(\rm lowbit\) 全相同的情形.

HDU7482 Array-Gift

首先把所有取模后等于 \(0\) 的数消掉.

然后可以把 \(a_0\) 变成 \(a_i+1\) 再取模得到 \(1\) 消掉其他数.

接下来只要考虑有没有一步就把 \(a_i\) 变成其他数的因数的操作.

牛客多校5H 入

因为每次只会选权值最小并且比当前节点权值小的子节点,所以其他结点接下来都不会被选到.

枚举起点直接爆搜,每次 ban 到不合法的点,搜索时间复杂度 \(T(n)=kT(n-k)=O(3^\frac{n}{3})\).

加上枚举的复杂度总复杂度 \(O(n3^\frac{n}{3})\) 可以过 \(n=40\).

具体实现:如果用 std::vector 预存合法点 push_back 前要先 reserve,不然可能会 T,或者可以开个数组记录节点被 ban 的次数,还可以加上根据当前答案和剩下合法节点的剪枝和位运算优化.

牛客多校6A Cake

\(S\) 差不多可以长这样:\(11110000110001\).

对于 \(S\) 第一段 \(1\) 和第一段 \(0\) 组成的前缀,因为蛋糕大小递减,平分蛋糕是最优的.

接下来考虑如何切能变得更优,一定是后面的一段 \(1\)\(0\)\(0\) 占比比之前前缀 \(0\) 的占比要多,于是要让后面的 \(10\) 段蛋糕尽可能大,所以还是平分是最优的.

于是 Oscar 能获得的最多的蛋糕就是 \(S\) 的前缀中 \(0\) 占比的最大值. 直接 dfs 转移即可.

牛客多校6D Puzzle: Wagiri

只考虑所有边求边双联通分量并缩点,然后考虑所有边判断图是否联通.

HDU7508 战争游戏

如果存在一个轰炸中心可以覆盖所有点,也就是将一个点作为根的叶子节点最大深度的最小值 \(d \leq r_1\),则袋鼠将军必胜.

设树的半径为 \(r\),那么 \(d \geq \lceil \frac{r}{2}\rceil\). 取树上距离最大两点的中点,则 \(d \leq \lceil \frac{r}{2}\rceil\)(若不然,与 \(r\) 是树的半径矛盾).

接下来,如果 \(r_2 \geq 2r_1+1\),则坎格鲁斯普雷必胜,因为如果 \(s\) 被轰炸了,就总存在一个没有被轰炸覆盖的点与 \(s\) 的距离是 \(2r_1+1\).

否则袋鼠将军必胜,因为每次取与 \(s\) 距离 \(r\) 的点作为轰炸点,以轰炸点为根,坎格鲁斯普雷可达的点 \(s'\) 必然在根包含 \(s\) 的子树 \(T\) 内且深度比 \(s\) 大,然后再选 \(T\) 内与 \(s'\) 距离为 \(r\) 的点为轰炸点反复进行下去即可.

HDU7500 树上 MEX 问题

所有连通导出子图的 \(\rm MEX\) 之和就是对含有权值 \(0 \sim i(i \in [0,n-1])\) 的连通导出子图的个数求和.

一棵树的连通导出子图个数可以 dp 求解,设 \(f_u\) 表示子树 \(u\) 经过 \(u\) 的联通导出子图个数,\(v\)\(u\) 的子节点,\(f_u=\prod (f_v+1)\).

可以以权值 \(0\) 的节点为根,找到极小的包含权值 \(0 \sim i\) 的连通导出子图,然后重新计算 \(f_v\)\(f_u\) 的贡献.

牛客多校7D Interval Selection

哈希或者线段树. TO BE UPDATED.

牛客多校7K Strings, Subsequences, Reversed Subsequences, Prefixes

哈希 + dp. TO BE UPDATED.

HDU7521 cats 的二分答案

对于一个长度为 \(d\) 的区间访问越界下标小于等于 \(k\) 次能获得的正确结果数是确定的,设为 \(f(d,k)\).

\(m=\lfloor\frac{d}{2}\rfloor\), 能得到的小于 \(m\)\(n\)\(f(m-1,k-1)\) 个,大于 \(m\)\(n\)\(f(d-m-1,k)\) 个,等于 \(m\)\(n\)\(1\) 个.

于是可以考虑记忆化搜索,状态数考虑分治树有 \(O(\log n)\) 层,每层的 \(d\) 只有 \(O(1)\) 个,有效的 \(k\) 只有 \(O(\log n)\) 个,所以总状态数是 \(O(\log^2 n)\) 的.

HDU7528 cats 的电脑中毒

考虑恰有两个字符相同的位,先最大化距离和,再进行调整一个加 \(1\) 另外两个 \(-1\),于是贡献为两个最小距离的均值.

HDU7522 cats 的最小生成树

跑 Kruskal 的时间复杂度是 \(O(\frac{m^2}{n})\) 的,跑 Prim 暴力更新的时间复杂度是 \(O(mn\alpha(n))\) 的.

\(n<\sqrt m\) 时跑 Prim,\(n \geq \sqrt m\) 时跑 Kruskal 即可通过本题.

上述做法需要跑 \(\lceil\frac{m}{n}\rceil\) 次 Kruskal,考虑其过程并尝试优化.

因为在可以合法连边的情况下,总是边权最小的进行连边,所以可以根据边权从小到大枚举边二分查找到能连边的编号最小的最小生成树,时间复杂度 \(O(m\log (\frac{m}{n}+1) \alpha(n))\).

牛客多校8E Haitang and Math

区间筛. TO BE UPDATED.

牛客多校9H Two Convex Polygons

\(B\) 在一点上能旋转出的最大圆直径可以用旋转卡壳求出,最终覆盖的图形只由圆弧和直线组成.

HDU7531 黑洞合并

手玩样例可以知道能量之和与顺序无关.

每次操作的贡献是 \(\sum\limits_{i\in S_1}w_i\sum\limits_{j\in S_2} w_j (\sum\limits_{i\in S_1} w_i+ \sum\limits_{j\in S_2} w_j) = \displaystyle\sum\limits_{i\in S_1,j\in S_2}w_iw_j(w_i+w_j).\)

考虑对于每一个 \(w_i\),每个 \(w_j(i \neq j)\) 都会和它乘恰好一遍,所以它的贡献就是 \(w_i^2 (\sum w_j - w_i)\).

所以总贡献就是 \(\dfrac{(\sum w_i)^3-\sum w_i^3}{3}.\)

HDU7530 树上询问

树链剖分后可以用线段树维护两个点路径的最值和权值和.

接下来只要找到这两个点,用线段树维护区间的深度最值点,最小值点即为 \(\rm LCA\),最大值点是一个端点,于是可以知道另一个端点的深度,用 set 维护同一深度的点集二分查找即可.

HDU7529 树异或价值

每个比特位是独立的,只要考虑 \(0\leq a_i \le 1\) 的情形.

\(dep_{\rm LCA}\) 的贡献,\(a\) 的价值为 \(\sum_{T' \in subtree(T)}\sum_{i,j\in T'} a_i \oplus a_j = 2\sum_{T'} (\sum_{i} [a_i])(|T'|-\sum_{i} [a_i]))\).

也就是说,要使 \(a\) 价值最大,每个子树中等于 \(0\)\(1\) 的结点个数相差不能超过 \(1\).

于是可以递归求解,设 \(T\)\(x\) 棵奇数个数节点的子树,那么需要钦定给这 \(x\) 棵子树 \(0, 1\) 的数量和根节点的奇偶性,所以 \(f(T)=\dfrac{\binom{x+1}{\lfloor \frac{x+1}{2} \rfloor}}{2^{x-((x+1)\&1)}}\prod_{T'\in subtree(T)}f(T')\).

HDU7535 小猫钓鱼

shuishui 和 sha7dow 的对子数量相同,有对子的时候必然出对子,当没有对子的时候,后手必胜.

当有对子的时候,总是 sha7dow 处于先没对子的状态,shuishui 必胜.

HDU7542 scenery

从后往前拍照片,在可拍摄区间选择左端点或者右端点肯定是最优的,对于其他可行的策略,都可以通过交换和平移拍摄区间变为端点.

于是可以设 dp 状态 \(f(i,j)\) 表示拍了后 \(i\) 张照片后可拍摄区间的左端点为 \(j\) 的最大右端点,转移 \(O(1)\).

HDU7550 A+B Problem

对于每一位,注意到因为异或是不进位加法,\(ans_{i-1}\) 不会改变 \(ans_i\) 当前位的值,只会影响进位.

所以可以从低到高处理出 \(ans_0\) 的每一位,再处理对下一位的进位.

牛客多校10D Is it rated?

注意 \(k\geq 0.1\),所以前面的场没必要 unrated 了.

具体而言,选择一个足够大的数 \(N\),只考虑后 \(N+m\) 场是否需要 unrated 即可.

posted @ 2024-11-02 11:48  Lcyanstars  阅读(13)  评论(4编辑  收藏  举报