2023 省选做题记录 6.0
最后两周就要开新坑(确信)。
3.20
2023.3.18 考试 T2 染色(paint)(性质 + 中位数)
题意:
你有一张纸带 \(S\),这张纸带分成若干个格子,每个格子被涂上了红绿蓝三种颜色之一。
作为一名有审美情趣的 OIer,你认为这张纸带并不好看,你打算将它重新染色使它的染色情况与一张同样长的纸带 \(T\) 相同。每一次操作,你都可以选择一个格子然后把它重新染成红绿蓝三色中任何一种颜色。
然而作为一名有强迫症的 OIer,你无法忍受相邻两个格子的颜色糊在一起。所以你规定在你染色过程中的任何时刻都必须保证相邻的格子颜色不同。
现在你要思考的是,最少进行几次染色操作能将纸带 \(S\) 染成 \(T\)?
数据范围:\(1\le n\le 5\times 10^5\)。


代码:https://paste.ubuntu.com/p/T3gMHqQdTr/。
[CF1806E] Tree Master(根号分治)
特别神奇的一道题目啊。
直接记忆化搜索复杂度是对的!
- 对于节点数 \(\le\sqrt n\) 的层,假设每一层有 \(x\) 个节点,那么最坏情况下会被调用 \(\binom{x}{2}\) 次,是 \(x^2\) 级别的。因为最多有 \(\frac{n}{x}\) 个这样的层,所以总的被调用次数是 \(\frac{n}{x}\times x^2=nx\) 的,时间复杂度为 \(\mathcal{O}(n\sqrt n)\)。
- 对于节点数 \(>\sqrt n\) 的层,这样的层不超过 \(\sqrt n\) 个,每一层最多被调用 \(q\) 次,时间复杂度为 \(\mathcal{O}(q\sqrt n)\)。
所以总的时间复杂度为 \(\mathcal{O}(n\sqrt n+q\sqrt n)\)。
实现的时候注意可以直接开数组存储答案。
代码:https://paste.ubuntu.com/p/BSvXDK69qG/。
JOISC 2023 Day2 T2(高维后缀和 + 乱搞)
[CF870F] Paths(性质 + 数论)
分类讨论。假设我们要求 \(dis_{u,v}\) 的值。
- \(u=1/v=1\),\(dis_{u,v}=0\)。
- \(u,v\) 不互质,那么 \(u,v\) 有公共因子,\(dis_{u,v}=1\)。
- 否则 \(u,v\) 互质:
- 设 \(p_u\) 为 \(u\) 的最小质因子,\(p_v\) 为 \(v\) 的最小质因子。
- \(p_up_v\le n\),\(dis_{u,v}=2\)(\(u\to p_up_v\to v\))。
- \(p_up_v>n,\max(p_u,p_v)\le \frac{n}{2}\),\(dis_{u,v}=3\)(\(u\to 2p_u\to2p_v\to v\))。
- \(p_up_v>n,\max(p_u,p_v)>\frac{n}{2}\),\(dis_{u,v}=0\)(无法到达)。
 
对于 \(dis_{u,v}=1\) 的情况,答案为 \(\binom{n-1}{2}-\sum\limits_{i=2}^n(\varphi(i)-1)\)。
对于 \(dis_{u,v}=2\) 的情况,比较难算,我们用 \(u,v\) 互质的情况数减去 \(dis_{u,v}=3\) 和 \(dis_{u,v}=0\) 的情况数来得到。
对于 \(dis_{u,v}=3\) 的情况,考虑推式子:
因为 \(uv>n\),所以一个数不可能同时包含 \(u,v\) 这两种质因子。那么我们就可以把 \(u,v\) 的贡献分开来算。
设 \(S_u=\sum\limits_{i=2}^n[p_i=u]\)。
对 \(S\) 做前缀和就可以线性求出。
对于 \(dis_{u,v}=0\) 的情况,式子类似。
代码:https://paste.ubuntu.com/p/jtnrjbh7TZ/。
3.21
[ARC136E] Non-coprime DAG(性质 + 差分)
先把 \(1\) 单独拿出来不考虑,最后输出时将答案加上 \(a_1\) 即可。
考虑到 \(2\) 是一个很好的介质,这引导我们往奇偶性的方向思考。
类似上一道题。对于两个数 \(u,v(u<v)\),设 \(p_u\) 为 \(u\) 的最小质因子,\(p_v\) 同理:
- 如果 \(u,v\) 都是偶数,那么显然 \(u\) 可达 \(v\)。
- 如果 \(u\) 为奇数,\(v\) 为偶数,那么 \(u\) 可达 \(v\) 的充要条件为 \(u+p_u\le v\)(\(u\to u+p_u\to v\))。
- 如果 \(u\) 为偶数,\(v\) 为奇数,那么 \(u\) 可达 \(v\) 的充要条件为 \(u\le v-p_v\)(\(u\to v-p_v\to v\))。
- 如果 \(u,v\) 都是奇数,那么 \(u\) 可达 \(v\) 的充要条件为 \(u+p_u\le v-p_v\)(\(u\to u+p_u\to v-p_v\to v\))。
考虑把这个性质运用到题目里。对于一个数 \(x\),设 \([l_x,r_x]\) 为它控制的区间,则有:
- 若 \(x\) 为偶数,则 \(l_x=r_x=x\)。
- 若 \(x\) 为奇数,则 \(l_x=x-p_x+1,r_x=x+p_x-1\)。
一个集合 \(S\) 合法的充要条件为集合内所有 \([l_x,r_x]\) 的交不为空。
所以就可以维护一个数组 \(b\),将 \(b_{l_x\sim r_x}\) 全部加上 \(a_x\),\(b\) 中最大值就是答案。
代码:https://paste.ubuntu.com/p/hhqCqGCj3Q/。
JOISC 2023 Day3 T3(回滚莫队 + 链表 + ST 表求 LCA)
3.22
JOISC 2023 Day4 T3(二分 + 暴力)
3.23
2023.3.23 考试 T1 代码军队(codeforces) / [CF1776C] Library game(博弈 + 结论)
题意:

数据范围:\(|A|\le m\le 5000\)。

结论题怎么做????*2500 都不会了!!!!!!!!!!!!!!!!!!!!!
代码:https://paste.ubuntu.com/p/q6sX6MPNMM/。
3.24
2023.3.24 考试 T1 文件传递(transmit)(线段树 + ST 表 + 倍增)
题意:
给定 \(n\) 个点和一个数 \(k\),有 \(m\) 条线路,每条线路有参数 \(a_i,b_i\)。如果 \(a_i<b_i\),则 \(\forall a_i\le j\le \min(a_i+k-1,b_i-1)\),由 \(j\) 向 \([j+1,b_i]\) 中的所有点连边;如果 \(a_i>b_i\),则 \(\forall \max(a_i-k+1,b_i+1)\le j\le a_i\),由 \(j\) 向 \([b_i,j-1]\) 中的所有点连边。
有 \(q\) 组询问,每组询问给定起点 \(S\) 和终点 \(T\),问 \(S\) 到 \(T\) 的最短路是多少。
数据范围:\(2\le n\le 10^6\),\(1\le m,q\le 10^6\)。
容易发现每个点能连边的范围都是一个包含它的区间。求出这个区间可以用线段树。设为 \([L_i,R_i]\)。
显然固定起点之后每个点经过固定步数可以走到的点的范围一定是一段连续区间。
然后考虑使用倍增维护走 \(2^i\) 步能走到的区间。容易发现对于一个能够到达的区间来说,每一步拓展的时候一
定走 向左能够到达的最远的 或者 向右能够到达的最远的。那么预处理这个东西的 ST 表,每次倍增时只需
要枚举后 \(2^i\) 步的起点为这两个中的一个即可。
说人话:每次向左 / 向右扩展一步一定是走到当前区间内 \(L_i\) 最小 / \(R_i\) 最大的点。
求答案也可以倍增。
代码:https://paste.ubuntu.com/p/M8zyDTJPwN/。
3.25
2023.3.24 考试 T2 顶尖协议 (apexprotocol)(min-max 容斥 + DP)
题意:

数据范围:\(n, m \le 30, T \le 5\)。
考虑 \(\min-\max\) 容斥,枚举集合,求钦定这些集合都满足条件的期望时间。只需知道所需要分发多少装备就可以知道期望的时间。如果 \(m>\frac{n}{2}\),那么可以直接暴力枚举所容斥的区间集合。否则可以使用 dp,\(f_{i,j,s}\) 表示考虑了第 \(i\) 个人,现在总共钦定了 \(j\) 件装备,覆盖了 \(i\) 的区间的选取情况为 \(s\) 的容斥系数之和。转移考虑枚举下一个集合是否被钦定。具体见代码。
代码:https://paste.ubuntu.com/p/5fhBQpgNtg/。
2023.3.25 考试 T1 Stonehenge Defensive (dragonbreath)(树状数组 + 倍增思想)
题意:
给定一个长度为 \(n\) 的序列 \(a\),近似计算其所有奇数长度子区间的中位数的和。
对于一个测试点,设真实答案为 \(A\),你的输出为 \(B\),只需满足 \(0.5A\le B\le 2A\) 即可 AC。
数据范围:\(1\le n\le 10^5,1\le a_i\le 10^{18}\)。
只考虑所有形如 \(2^i\) 的数的贡献就行了。把 \(\ge 2^i\) 的看成 \(1\),其它的看成 \(-1\),统计和 \(\ge 0\) 的区间个数。
代码:https://paste.ubuntu.com/p/yxWjdySQzk/。
2023.3.25 考试 T2 Bunker Buster (magicspear)(结论 + 枚举 + 计算几何)
题意:

数据范围:\(3\le n\le 50,1\le x,y\le 1000,T\in\{0,1\}\)。
结论题。似乎可以直接枚举外接圆。

代码:https://paste.ubuntu.com/p/ptm7JsTBSJ/。
3.26
2023.3.25 考试 T3 Cape Rainy Assault (werewolf)(容斥 + 组合计数 + 拉格朗日插值)
题意:
有一个 \(n\) 个点的完全图,其中每条边的边权都是一个在 \([1,k]\) 内均匀随机的整数,求这个完全图的最小生成树的期望边权和,对质数 \(P\) 取模。
数据范围:\(1\le n\le 100,1\le k\le \min(10^9,P-1),9\times 10^8\le P\le 10^9+9\)。

不会拉插就没写代码了。
3.27
2023.3.27 考试 T2 布置核弹 (nuclear)(莫队复杂度证明 + 排序)
题意:
给定 \(n\) 个三元组 \((x_i,y_i,z_i)\),要求重排它们使得 \(\sum\limits_{i=2}^n|x_i-x_{i-1}|+|y_i-y_{i-1}|+|z_i-z_{i-1}|\le lim\),其中 \(lim\) 是一个给定的值。判断有无解。若有解则输出任意一种方案。
数据范围:\(1\le n\le 10^6\)。\(n\le 11\) 时,\(lim\ge 110\);\(n\le 20\) 时,\(lim\ge 330\);\(n\le 1000\) 时,\(lim\ge26\times10^4\);\(n\le 10^6\) 时,\(lim\ge 299,8348,9598\)。
考虑将坐标看成询问,然后直接三维莫队就行了,\(T=\mathcal{O}(n^{\frac{5}{3}})\)。因为数据随机生成,所以基本上无论怎么排序,只要是正常的莫队都可以通过。

代码:https://paste.ubuntu.com/p/gRktfqwz8z/。
2023.3.27 考试 T1 破解密码 (keyword) / [CF1500E] Subset Trick(二分 + 线段树)
可见 https://www.luogu.com.cn/blog/Leasier/solution-simulation-2023-03-24-keyword。
而 \(pre_i\) 和 \(suf_i\) 其实都可以用线段树来维护。
代码:https://paste.ubuntu.com/p/bmgbHVMsWj/。
2023.3.27 T3 最终对决 (battle) / [CF914H] Ember and Storm's Tree Game(组合计数 + DP)
orz xzy。https://www.cnblogs.com/xiaoziyao/p/15347332.html。
代码:https://paste.ubuntu.com/p/6DnpMtTwrr/。
3.28
2023.3.28 考试 T1 零壹零 (sequence)(线段树 + 二分)
题意:
对于长度为奇数的序列 \(a_{1\sim k}\) ,定义 \(f(a)\) 为:
- 若 \(k = 1\),\(f(a) = a_1\)。
- 若 \(k > 1\),记 \(a'\) 为删除 \(a_{1\sim3}\) 中的最大值和最小值后(如果有多个,只删除一个)得到的序列,\(f(a) = f (a')\)。
例如,\(f ([1, 3, 2, 2, 5]) = f ([2, 2, 5]) = f ([2]) = 2\)。
给定整数序列 \(a_{1\sim n}\),你需要支持 \(q\) 次操作:
1 l r x,对于 \(i = l \sim r\),执行 \(a_i \leftarrow a_i + x\),即给下标在 \([l, r]\) 中的 \(a_i\) 都加上 \(x\)。
2 l r,求 \(f (a_{l\sim r})\),保证 \(r − l + 1\) 是奇数。数据范围:\(n,q\le 3\times 10^5,|a_i|,|x|\le 10^9,1\le l\le r\le n\)。
考虑单次询问怎么做。二分最终答案 \(mid\),将 \(\ge mid\) 的数看成 \(1\),其它数看成 \(0\)。找到最大的 \(mid\) 使得返回值为 \(1\)。把 \([a_{l+1},a_{l+2}],\dots,[a_{r-1},a_r]\) 看成若干个区间,找到最靠右的一个不是 \([0,1]\) 的区间,这时候这个区间显然左右端点相等,返回这个相等的数就是最终结果。
多次询问考虑直接做这个过程。把区间放到线段树上,线段树上维护这个区间内的区间的交。二分找到最左的点 \(pos\) 满足 \(pos\sim r\) 里面的区间的交非空,把这个交的两个端点和 \(pos-1\) 的一个端点拿出来,中间那个位置就是答案。具体看代码。
能少开线段树就少开,常数会是一半😅。挂了一半的分😅。
代码:https://paste.ubuntu.com/p/82xB76kBFm/。
2023.3.28 考试 T2 二次(元)杂货铺 (minasann)(分数规划 + 最大权闭合子图)
题意:
给定 \(n\) 个物品,第 \(i\) 个物品的权值为 \(a_i\)。你需要选出一个 \(\{1, 2, \dots , n\}\) 的非空子集 \(S\) 满足,对于给定的 \(m\) 条单向关系 \((u, v)\),若 \(u \in S\),则 \(v \in S\),在此基础上最大化 \(\frac{(\sum\limits_{i\in S}a_i)^2}{\sum\limits_{i\in S} a_i^2}\)的值。你只需要输出这个最大值。
保证没有重复的单向关系,注意 \((u, v)\) 和 \((v, u)\) 被视作不同的单向关系。
数据范围:\(1\le n\le 60,1\le a_i\le 1000\)。
二分答案 \(mid\)。
平方可以套路地看成 \((\sum\limits_{i\in S}a_i)(\sum\limits_{i\in S}a_i)\),也就是每两个选入集合的数都会有一个贡献。
式子可以拆成 \((\sum\limits_{i\in S}a_i)(\sum\limits_{i\in S}a_i)-mid\sum\limits_{i\in S}a_i^2>0\)。
把每个点点权看成 \(-mid\times a_i^2\),然后选两个点 \(i,j\) 就会有 \(a_i\times a_j\) 的贡献,还有若干选了 \(u\) 就必须选 \(v\) 的限制。直接跑最大权闭合子图就行了。
为了卡精度要用 __float128。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号