HN省队集训2021题解
2022/8/22 23:23:06
本文主要是介绍HN省队集训2021题解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
不知道写什么题于是补一下去去年的集训题
部分题没补,都是题目涉及的算法我还没学过,分别是d1t3,d3t2,d4t2,d7t3,d8t2
空白部分是准备改但还没改的题
Day1
T1 数列
设 \(f_i\) 表示以 \(i\) 结尾的最大值,设 \(l_i,r_i\) 表示 \(a_i\) 覆盖到的左右端点 考虑写出一个比较显然的式子:
\[f_i= \max_{j<i,l_i \le r_j + 1} f_j + (a_i-a_j)^2 + C \]这时候就能直接二维偏序套李超树,\(O(n\log^2 n)\) 无法通过此题。
但是可以发现去掉二维偏序的顺序直接转移是对的。也就是说不满足约束条件的决策无法更新最大值
具体的,设 \(k\) 为 \([i,j]\) 内最大值的位置,只考虑 \(a_k > \max(a_i,a_j)\) 的情况,那么 $$(a_i-a_j)^2 < (a_k-a_i)^2 + (a_k - a_j)^2$$
所以 \(j\) 这个决策显然不优于 \(k\)。
于是我们直接李超线段树斜率优化即可。
T2 差量
先通过一次 \(M2\) 求得全局的极差,然后二分一个前缀的极差是否等于全局的极差。
此时我们可以确定最大值最小值其中一个的位置,并且设这个位置为 \(x\) 。再随意询问一个位置的值即可知道是最小还是最大。
考虑使用二进制分组,设 \(S_i\) 表示二进制下下标的第 \(i\) 位为 \(1\) 的所有下标集合。
分别查询 \(S_i\) 和 \(S_i \cup x\) 再去重可以知道 \(S_i\) 所有数的值。
设 $ cnt_i $ 表示 \(i\) 二进制下 \(1\) 的个数,那么 \(a_i\) 必定在所有的 \(S_i\) 恰好出现了 \(cnt_i\) 次,并且有且仅有一个数满足这个条件。
最后统计一下 \(M2\) 操作的使用次数 : 二分 \(\log_2n\) , 查询 \(S_i\) 和 \(S_i \cup x\) 也是 \(\log_2n\),所以总共是 \(3\log_2n\)
T3 异或
std 写了 9k 的 容斥+FWT 逆天神题,不会
极限得分 : 25 pts
Day2
T1 NOI!
应该是省集里最水的一道题了。。。
如果 \((x,y)\) 要染色那么 \((x+5,y+5)\) 一定也会被染色。
考虑按 \((x\bmod 5,y\bmod 5)\) 分类,然后做 \(25\) 遍扫描线即可。
T2 模拟?
首先删边最大独立集最多 \(+1\),加边最大独立集不变大
考虑删边 \(u,v\) : 想一想满足什么条件下会 \(+1\) ,那么就是当断开\(u,v\)后,选 \(u,v\) 比不选 \(u,v\) 各大 \(1\)。
考虑加边 \(x,y\) : 如果 \(x,y\) 分别是 \(u,v\) 最大独立集中的必选点 ,那么答案就会 \(-1\)。
考虑暴力枚举删哪条边,然后树形 \(dp\) 两棵树,求出必选点的个数即可。
事实上必选点可以直接通过儿子节点的必选点个数推出。设 \(cnt_i\) 表示 \(i\) 节点儿子的必选点的个数。
那么 必选\可选可不选\必不选 分别对应 \(cnt_i = 0\) , \(cnt_i = 1\) , \(cnt_i > 1\)。
写出这个 \(O(n^2)\) 暴力后我们发现是可以直接换根 \(dp\) 的。所以换根和自底向上推写起来是差不多的。
T3 AK啦!
逆天智商题。
如果查询 \((x,y)\) 为 \(0\) 的话,那么查两次可以确定是竖线还是横线。
如果查询 \((x,y)\) 为 \(k\) 的话,那么 \((x+k,y+k) , (x-k,y-k)\) 必有一个是 \(0\)。
考虑只在 \(x=y\) 这条线上询问。那么就变成了一维问题。考虑分治实现。
每次询问 \(mid = (l+r)/2\) 得到 \(d\) , 递归 \([l,mid-d]\) 和 \([mid+d,r]\) 继续做。
Day 3
T1 合成小丹
把 $ \lfloor \frac{x}{2} \rfloor$ 看成二进制的右移 \(1\) 位。所以 $ \lfloor \frac{x}{2} \rfloor$ \(|\) $ \lfloor \frac{y}{2} \rfloor = $ $ \lfloor \frac{x|y}{2} \rfloor$ 。
设 \(d_i\) 为 \(a_i\) 参与合并的次数,在仅考虑合并操作的情况下,
那么答案就是所有 \(\lfloor \frac{a_i}{2^{d_i}} \rfloor\) 或起来,一组 \(d_i\) 合法当且仅当 \(\sum \frac{1}{2^{d_i}} = 1\)。
加上删除操作后就是 \(\sum \frac{1}{2^{d_i}} \ge 1\)。
我们设 $S= { 1,2,3...n } $ , 那么当 \(\sum \frac{1}{2^{d_i}} \ge 1\) 是否一定存在一个 \(\sum_{i \in S}\frac{1}{2^{d_i}} = 1\) 呢?答案是肯定的。这个随手证一下就好了
此时我们确定了一个思路: 在满足条件的情况下 \(\sum \frac{1}{2^{d_i}}\) 越大越好,我们考虑从高到低位贪心填数。然后用上面的结论计算出当前的 \(d_i\) 再判断 \(\sum \frac{1}{2^{d_i}} \ge 1\) 即可。
这个算法复杂度是 \(O(Tnw^2)\) 的,理论上过不了,但赛时有人实现精细是过了的。
我们考虑用位运算的性质优化掉一个 \(w\) 。
对于每个 \(a_i\) 设一个 \(b_i\) , \(b_i\) 的第 \(j\) 位为 \(1\) 表示 \(a_i\) 右移 \(j\) 位和答案或起来不等于答案本身。
那么 \(b_i\) 的最低位 \(0\) 就是 \(d_i\) 的最优取值。所以只要维护当答案某一位由 \(1\) 变 \(0\) 时 \(b_i\) 的变化即可。
设变化的的位置为第 \(t\) 位,不难发现此时只要使 \(b_i = b_i | (a_i >> t)\) 即可。
最后提及一个小 \(trick\) , 如果知道 \(2^k\) 次方 想 \(O(1)\) 求出 \(k\) 是多少,可以运用费马小定理。
(偷懒写了 \(O(Tnw^2)\) )
T2 路过中丹
不会
标算是 分治+单调栈+回文树上倍增,有选手用 manacher+单调栈+线段树/树状数组 的离线算法过了。
有点难写。以后研究一下。
极限得分 : 45pts 结论是要么有一个 \(aba\) 形式的子串,要么是有偶回文串覆盖
T3 膜拜大丹
不难发现只选二元环即可。并且倒序选肯定最优。
知道这两个结论后直接用 \(set\) 模拟即可。
题解做法非常难想到
首先我们是可以用二分图匹配暴力解决原问题的,考虑将问题简化到坐标轴上
先在图上标出 \((i,a_i)\) 和 \((j,b_j)\) ,然后引一条线落到 \(x\) 或 \(y\) 轴上。
那么 \(i,j\) 有边当前仅当 两个点对应的直线有交,如下图所示 (图是嫖的题解的)。
最大匹配不好求,求最大独立集(这个转换有点nb)。
那么问题的答案转化为:
在 \((i,a_i)\) 放一个点权为 \(c_i\) 的红点,在 \((b_j,j)\) 放一个点权为 \(c_j\) 的红点。那么在所有从左下角格子只能向右向上走走到右上角的外面的方案中,只保留路径上方的绿点点权和路径下方的红点点权的点权和的最大值。如下图所示
此时可以写出如下的dp式子:
考虑优化 dp 的过程,发现如果钦定了一些红点被选择,那么贴着这些红点走一定是最优的,因为这样
会保留尽可能多的绿点(如下图贴着红点走)。
然后写出下列式子:
改写一下方程
线段树加树状数组维护即可,时间复杂度 \(O(n \log_2 n)\)。
我写的是出题人题解的做法,后面发现有选手写了上面提及的第一种做法,感觉题解那个太难想到了。
Day 4
T1 我醉
先二分答案,然后点分治,每次在长链处统计跨过分治中心的答案,短链的长度可以直接算出来。然后再判断长链截去一个短链的后缀后形成的部分是否是一个回文串即可。分别用 字符串 \(hash\) 和 \(hash\) 表解决即可,时间复杂度 \(O(n\log_2^2n)\)
T2 梧桐依旧
Burnside引理 + 行列式,不会
T3 卿且去
题解用 \(Dilworth\) 定理证的结论,感觉没这个必要而且不直观。
考虑如果 \(x \in T\) 且 \(2x \le n\) 那么很显然 \(2x \in T\),此时 \(x\) 就没用了。
而且对于 \(\forall x,x \in [n/2+1,n]\) 是互不成倍数关系的,所以我们只要知道 \(x \in [n/2+1,n]\) 在所有 \(S\) 的出现次数即可。设 \(\pi(n)\) 表示 \(n\) 以内的质因子数量,\(\omega(x)\) 表示 \(x\) 的质因子种类数, 答案就是
不难发现 \(2 ^ {\omega(x)}\) 是积性函数,套个min_25板子就好了。
Day 5
T1 下落的数字
首先父亲到每个儿子都对应一段值域区间,先树剖,用线段树维护每条重链的区间交,在线段树上二分可以知道最远可以跳到哪,然后再用 \(set\) 查询跳到哪个轻儿子。最多跳 \(O(\log2_n)\) 次,总复杂度 \(O(n\log_2^2n)\)。
T2 序排速快
T3 树
Day 6
T1 一般图带权多重匹配
先考虑 \(a_i\) 全是偶数的情况。把操作看成在图上加一条边,那么原图一定存在欧拉回路。
思考一下欧拉回路的实现,我们必定能把每个点的边分为一半出度一半入度,此时网络流建模就很显然了:
\(1\) . \(add(S,i_1,\frac{a_i}{2},0)\)
\(2\) . \(add(i_2,T,\frac{a_i}{2},0)\)
\(3\) . \(add(i1,j2,inf,c_{i,j})\)
那么因为奇数最多 \(10\) 个 ,直接 \(2^{10}\) 枚举是出度还是入度。
T2 排序
T3 传染
暴力做法:枚举两个点直接连边,跑个强联通分量求出所有的零入度点个数就是答案。
考虑用点分治加前缀优化建图来优化建边。
每次只考虑跨过分治中心的连边,按节点到分治中心的距离排序。
那么每个点连向的必定是一段前缀。前缀优化建图即可。
时间复杂度 \(O(n \log_2^2n)\) 赛时写这个很大概率被卡常。
有一个隐式建图的做法常数很小,感兴趣的可以思考一下。。
Day 7
T1 好
首先题目这个约束条件可以转化成每次删一个先升后降的差为 \(1\) 序列。
可以直接 \(O(n^4)\) 暴力区间 \(dp\)。
考虑到 \(l,r\) 两个位置如果没有同时被删除那么 \(a_l\) 和 \(a_r\) 本身就是可以独立转移的。
所以只考虑 \(a_l\) 和 \(a_r\) 同时被删除,那么就很简单了。
设 \(l_{i,j}\) 表示从 \(i\) 删到 \(j\) 升序可以划分出的 \(f\) 的最大值。\(r_{i,j}\) 则是降序
时间复杂度 \(O(n^3)\)
T2 色
结论:答案是最小生成树上一条边的边权。
开三种不同的 \(set\),分别维护
1.一个点儿子节点每个颜色的集合.
2.每个颜色(除当前颜色外)离他最近的儿子点集合.
3.全局的答案。
模拟即可。
T3 乐
分治 NTT,不会
这篇关于HN省队集训2021题解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南