杂题乱做 - 2000-
- 写在前面
- CF1992F 贪心,数学 1900
- CF2008G 贪心,数学 1800
- CF2009G1 数据结构 1900
- CF 1891D 数学 1900
- CF1996F 二分,简单数学 1900
- CF1985G 数学 1600
- CF1095D 构造 1600
- P6075 数学,结论,组合 普及/提高−
- P6146 计数 DP 普及+/提高
- CF2007C 数论,双指针 1500
- CF1895D 二进制,构造,Trie 1900
- CF1581B 图论,构造 1200
- CF298B 模拟,枚举 1200
- CF1352G 构造 1600
- CF2014H 异或哈希/莫队 1900
- CF461B 树形DP 2000
- CF1946C 二分答案,贪心 1600
- CF1493C 贪心,枚举 2000
- 写在最后
写在前面
简单题们。
记录一下以后用来搬题。
唉唉现在 2000 及以下都能直接秒了真没意思。
CF1992F 贪心,数学 1900
显然直接贪心划分即可,主要问题是如何判断区间内子序列乘积恰好为 \(x\)。
发现 \(x\le 10^5\),考虑对 \(x\) 质因数分解,在枚举区间时维护 \(x\) 中各质因数的数量即可。
CF2008G 贪心,数学 1800
发现给定过程即辗转相减,则最优的构造一定是 \(0, \operatorname{gcd}, 2\operatorname{gcd}, \cdots\)。然后就能直接算 \(\operatorname{mex}_k\) 了。
CF2009G1 数据结构 1900
首先套路地令 \(a_i:= a_i - i\),则令区间变为公差为 1 的等差数列即令区间相等。
显然对于一个长度为 \(k\) 的区间应该调整成其中的众数,于是直接枚举所有长度为 \(k\) 的区间,记录区间内权值出现次数预处理即可。
CF 1891D 数学 1900
一眼题,发现 \(f\) 和 \(g\) 都是有非常显然的分段性质,\(f\) 至多只有 \(\log_2 v\) 段,在此基础上可知 \(g\) 至多只有 \(\log^2 v\) 段,大力枚举很容易就能处理出每一段的边界。
\(q=10^5\) 但是只有 1s,\(O(q\log^2 v)\) 不好跑,考虑预处理一下 \(1\sim 2^k - 1\) 的答案,则每次询问仅需考虑最后至多 \(\log v\) 段即可。
总时间复杂度 \(O\left(\log^2 v + q\log v\right)\) 级别。
会爆 LL 呃呃调红温了。
CF1996F 二分,简单数学 1900
看完题就想直接搞棵权值线段树,插入等差数列,然后在线段树上二分前 \(k\) 大之和即可。然而数据范围并不允许建树,失败!
虽然没法建树,但是发现二分权值区间是可以的。考虑从权值区间 \([L, R]\) 取前 \(k\) 大之和的答案,仅需检查左右子区间中数的个数与和再递归解决即可。
检查权值区间中数的个数与和显然能通过直接枚举每个元素 \(O(n)\) 直接算,则总时间复杂度为 \(O(n\log v)\) 级别。
CF1985G 数学 1600
发现给的限制 \(D(k\cdot n) = k\cdot D(n)\) 非常严格,当且仅当所有位均不出现进位才可满足。则可知对于 \(k\ge 10\) 答案一定为 0。
保证不进位则每位就是独立的了,可以计算出每位填的数的范围为 \(\left[0, \left\lfloor\frac{9}{k}\right\rfloor + 1\right]\),又询问的区间端点均为 10 的幂,转化成前缀相减的形式就能非常简单地计算了。
CF1095D 构造 1600
简单题,忘了为啥出现在我的浏览器里了。
考虑对于节点 \(u\) 的两个后继 \(v_1, v_2\) 的实际顺序,发现仅需检查 \(v_1,v_2\) 之间的后继关系即可。于是可以直接处理出所有节点的直接后继,然后随便找个点 dfs 跳后继,保证每个节点仅出现一次即可。
不能只跳直接后继,比如一种需要特判的情况:
3
3 2
3 1
1 2
P6075 数学,结论,组合 普及/提高−
显然 \(n\) 个数在集合中是独立的,于是先考虑只有一个数的情况,仅需考虑 \(\frac{k(k+1)}{2}\) 个子集中是否存在该数即可。
由题意,每个集合都为其左边和上面的集合的子集,发现此时合法,当且仅当三角形中存在一条从左下角向上向右走到边界的分界线,使得分界线上方均为 1,下方均为 0。发现构造分界线等价于从最左下角的点走 \(k\) 步,每一步有向上和向右两种选择,则方案数为 \(2^{k}\)。
再考虑有 \(n\) 个数,则答案即 \(2^{k\times n}\)。
感觉很适合当结训测试简单题哈哈。
P6146 计数 DP 普及+/提高
唉唉计数。
一个显然的想法是考虑按照某种端点排序后依次加线段,考虑加入的线段与之前的有无相交部分:若有则不影响连通块数量,可直接继承之前的答案;否则若无相交部分,则会且仅会产生一个新连通块,仅需在继承的同时,考虑有多少种子集与新线段不相交即为新增的贡献。
发现按右端点升序加线段时,可能会出现加了一条很长的线段,同时与之前的多个连通块相交导致连通块数减少,导致很难做。
考虑按左端点升序加线段,即可保证加入后若相交不会导致连通块数减少。记 \(f_i\) 表示加入第 \(i\) 条线段 \((l_i, r_i)\) 后所有子集连通块数,则继承即为直接加上 \(f_{i-1}\);若与新线段不相交,则之前加入的线段右端点一定小于 \((l_i, r_i)\),若此类线段有 \(c\) 条则不相交的子集数即为 \(2^{c}\)。
考虑记 \(\operatorname{sum}_{i}\) 表示右端点为 \(i\) 的线段数量,则有显然的转移:
对 \(\operatorname{sum}_i\) 提前预处理前缀和即可 \(O(1)\) 转移,答案即为 \(f_n\)。
总时间复杂度 \(O(n)\) 级别。
CF2007C 数论,双指针 1500
众所周知有小凯的疑惑,则对于该题任意 \(+A/+B\),则可以表示出比较大的任意 \(d=\gcd(A, B)\) 的倍数。
于是可看做都可以加任意 \(d\) 的倍数,则答案肯定不超过 \(2d\),于是考虑把原数列扔到 \(\bmod d\) 剩余系下看,则可以看做每个数 \(x\) 可以被修改为 \(x\bmod d\) 或 \(x\bmod d - d\)。
然后考虑把原数列中 \(x\) 拆成 \(x\bmod d\) 和 \(x\bmod d - d\),排序后在新数列上做双指针,求固定最小值时最大值的最小值,保证区间内有原数列中所有位置,求极差的最小值即可。
总时间复杂度 \(O(n\log n)\) 级别。
CF1895D 二进制,构造,Trie 1900
这个套路在江队出的结训比赛题见过哈哈。
显然有前缀和 \(\operatorname{pre}_i = b_1\oplus b_{i + 1}\),因为保证有解,说明 \(\operatorname{pre}_i\) 是两两不相等的,且均不等于 0,但是可能大于 \(n-1\);于是仅需考虑如何找到 \(0\le b_1\le n - 1\),使得 \(b_i\) 均不大于 \(n-1\) 即可,从而使 \(b_1\sim b_n\) 恰好为 \(0\sim n - 1\)。
记 \(\operatorname{pre}_0 = 0\),问题也可以看做构造 \(0\le b_1\le n - 1\),使得 \(\forall 0\le i\le n - 1, \operatorname{pre}_i \oplus b_1 = b_{i + 1}\) 恰好为 \(0\sim n - 1\)。
这显然是个典,考虑放到 Trie 上考虑,将 \(\operatorname{pre}_i\) 先插入到 Trie 里,则令所有数某一位异或 1 相当于交换这一位对应层的上一层所有节点的左右儿子,问题即通过交换儿子操作使得 Trie 变为一棵满二叉树。因为保证有解,于是仅需自顶向下构造,每次考虑当前节点左右儿子的 \(\operatorname{size}\) 与最终状态的 \(\operatorname{size}\) 的关系,若不相等则交换儿子,然后仅考虑最右侧的非空的子树进行递归构造即可。
然后就能构造出 \(b_1\) 了。总时间复杂度 \(O(n\log n)\) 级别。
CF1581B 图论,构造 1200
妈的被 div2B 1200 硬控十分钟,什么图论小结论整合版妈的。
先判断边数对于简单无向连通图是否过少或过多。
然后讨论直径长度:
- 小于 0 则无解;
- 小于 1 当且仅当 \(n=1\) 有解;
- 小于 2 当且仅当恰好构成完全图有解;
- 小于 3 则可以先构造一个菊花图,然后随便加边,则一定有解、
CF298B 模拟,枚举 1200
傻逼模拟。
显然两维的移动独立,仅需考虑与终点的位置的两维上分别的差值,移动距离均为 1,且要求时间最小,则贪心地进行移动,当且仅当遇到与差值同方向的移动,且这一维上未到达终点则移动即可。
还感觉可以出成风向任意,就能 \(O(m^2)\) DP 了。
CF1352G 构造 1600
入门构造。
相邻两个数距离至少为 2,一个显然的想法是分奇偶讨论,考虑将奇数降序放到前面,偶数升序放到后面。
此时中间两个的相邻数为 1 2
,不合法,仅需将 2 和 4 交换位置即可。
CF2014H 异或哈希/莫队 1900
显然两人最优策略均为每次选择当前剩的数中最大的数。此时显然先手有极大优势,可以保证每轮选择的数一定不小于第二个人选的数,因此仅有可能先手必胜或平局。
发现平局当且仅当两个人选的数的个数相同,且每轮选择的数均相同,即每个数出现次数都是偶数。
莫队/异或哈希实现即可。
注意到值域很小,如果使用异或哈希,需要先将所有权值映射随机到较大的值域上以保证正确性。
CF461B 树形DP 2000
套路树形 DP。
显然可以仅考虑子树内是否有黑色点,以及当前点是否为黑色点自底向上 DP。设 \(f_{u, 0/1}\) 表示以 \(u\) 为根的子树内,钦定根所在的联通块无/有黑色点的选择方案,为了辅助转移再记 \(g_{u, 0/1}\) 表示表示以 \(u\) 为根的子树内,先钦定节点 \(u\) 不选,并钦定根所在的联通块无/有黑色点的选择方案。
转移时考虑枚举子节点的子树,考虑添加后是否有黑点即可,则有:
然后考虑到可以将 \(u\) 单独分为一个联通块,当 \(u\) 为黑点时,\(f_{u, 0}\) 无意义,有:\(f_{u, 1} = g_{u, 0}\);否则有: \(f_{u, 1} = g_{u, 1}, f_{u, 0} = g_{u, 0} + g_{u, 1}\)。
答案即:\(f_{rt, 1}\)。
总时间复杂度 \(O(n)\) 级别。
CF1946C 二分答案,贪心 1600
典中典题。
套路二分答案,dfs 检查使得每个连通块均大于 \(\operatorname{mid}\) 时,最多删边数量。
考虑贪心地删边,若当前节点所在连通块大于 \(\operatorname{mid}\) 则删边,此时至多仅有 \(1\) 所在连通块不合法,则发现此时合法当且仅当最多删边数量 \(\ge k + 1\)。
总时间复杂度 \(O(n\log n)\) 级别。
CF1493C 贪心,枚举 2000
显然最好的情况是 \(s\) 是 beautiful 的。
否则考虑按长度降序枚举待构造串第一个与 \(s\) 不同的位置 \(i\),再按字典序升序枚举需要将该位置修改为什么字符。记此时字符 \(c\) 有 \(\operatorname{cnt}_c\) 个,则为了保证 beautiful,显然至少还需要 \((k - \operatorname{cnt}_c\bmod k)\bmod k\) 个。记 \(\operatorname{need} = \sum_c (k - \operatorname{cnt}_c\bmod k)\bmod k\),则对于剩下的空位还应有 \((n - (i + 1) - \operatorname{need})\bmod k = 0\),再用 a
将其补全即可。
仅需在枚举 \(i\) 过程中顺便维护每种字符的出现次数以及 \(\operatorname{need}\) 即可。判断某个 \(i\) 合法后,即可得到补全剩下的部分最优的字符集,贪心构造即可。
写在最后
唉唉马上退役了。