Contests
比赛总结
包括自停课以来的打过的各种比赛
#1. NOIP十三连测 #1
T1
70pts
均值不等式
但这是真的, 有 70pts 给了均值不等式
需要注意的是, 可以通过分离变量, 统计是否有满足条件的点
100pts
由均值不等式启发, 我们发现两点连线与坐标轴的夹角接近 45 度 或 135 度, \(val\) 越大
于是我们考虑旋转坐标轴, 使得 \(y' : y = -x\) 和 \(x' : y = x\) 作为新的坐标轴
然后问题转化为两点连线和坐标轴的夹角尽可能小
旋转坐标轴以后, \((x_0, y_0)\) 变为 $ (\frac {\sqrt{2}(x_0 + y_0)}{2}, \frac {\sqrt{2}(x_0 - y_0)}{2}) $
对于新的坐标系, 想要让两点连线与坐标轴夹角最小
-
按 \(x\) 排序, 此时与 \(y\) 轴夹角最小的两个点一定相邻
(等价于在原坐标系中按 \(x_i + y_i\) 排序)
-
按 \(y\) 排序, 此时与 \(x\) 轴夹角最小的两个点一定相邻
(等价于在原坐标系中按 \(x_i - y_i\) 排序)
取出最大值即可
#2. NOIP十三连测 #2
T1 写完正解以后把暴力交上去了
真是一场酣畅淋漓的破防啊
T1
我们知道, 一个序列翻转两次相当于没有翻转
于是我们考虑在末尾加完了后翻转, 等价于在翻转后的序列前面加
然后再在末尾加, 再翻转
最终结果就是原序列的后面加入了第一个数, 原序列的前面加入了第二个数
\(n\) 次操作就是在不断重复这个过程
然后就非常简单了
T2
容易发现这就是在求最小生成树
然后要求支持动态加边
\(\text {LCT}\) 秒了
upd:
发现只需要对原来最小生成树上加一条边以后形成的基环树求最小生成树就行了
然而最后因为不明原因只有 90pts
为什么能T掉一个题中间的一个点????
T3
排序不等式
先拆柿子 \(\sum (a_i - b_i) ^ 2 = \sum a_i ^ 2 + \sum b_i ^ 2 - 2 \sum a_i b_i\)
我们又知道让 \(a\) 和 \(b\) 顺序相同的情况下, 有 \(\sum a_i b_i\) 最大
因此我们希望通过交换操作, 使 \(a\) 与 \(b\) 同序
可以证明, 每次把 \(a\) 中我们要的数直接交换过来时, 交换次数最小
考虑不直接交换过来, 而交换到别的的地方去
"到别的地方去" 最多减少一次操作
然而因为 "不直接交换过来" , 必须还要再次进行交换才能得到我们想要的
于是 "不直接交换" 并不能给出更优的解
T4
见 OneNote
#3. 威海一中 科技特长生期末测试
题目有点过于水了
T4
考虑每个同学只能表示出两个数, \(a_i\) 和 \(a_i \oplus b_i\)
于是可以统计每个数最多可以被多少个同学表示
特别地, 当 \(a_i = a_i \oplus b_i\) 时, 她们不能做出两次贡献
容易求得答案
需要注意
xor的优先级 !!!
if (a[i] == a[i] xor b[i])和if (a[i] == (a[i] xor b[i]))所产生的效果并不相同
T5
考虑朴素的暴力, 枚举 \(h\), 然后取最大
对其做一个平凡的转换, 转换为不改变 \(x\) , 只整体改变边界线的位置 (保证边界线相对位置不变)
感性的注意到, 在 \(4\) 条线都不碰到点的情况下, 轻微的改变 \(h\) 不会影响答案
这也就启示我们, 答案只有可能在 线碰到点 或者 线在点旁边 时产生
于是直接枚举四条线, 让她们分别碰到点, 容易使用值域线段树求出答案
卡常!
尽量不要用
unordered_set, 常数非常大, 实际体验比set慢
#5. Codeforces Round 957 (Div. 3)
#6. 梦熊模拟赛
2024.7.16
挂大分
不好评价, 最终得分 70 pts
挂分情况:
T1 没判 \(k = 0\) 怒挂 \(\text{10pts}\)
T2 把 \(n \times 2 ^ {10}\) 优化成 \((\ln n) \times 2 ^ {30}\) . 我真是个人才
T3 想出正解但没写, 鉴定为码力太弱
T4 大常数暴力被卡成 \(\text{0}\)
T1
见 OneNote
一点感想:
计数类 \(\text{dp}\) 重点在于不重不漏
而最优化类 \(\text{dp}\) 重点在于最优化
在最优化问题中, 即便同一个局面被表示在不同的状态中, 即便一个局面被多次考虑, 只要不漏考虑局面, 就能够得到最优解
但是在计数类问题中, 这样随意的设计状态的方式不被允许, 因此经常需要钦定一些必要的变量记录到状态中
什么是钦定?
(个人理解)
举一个例子
\(dp[i][j]\) 表示考虑前 \(i\) 个, 已经选了 \(j\) 个
\(dp[i][j]\) 表示最后一个选的右端点恰好为\(i\), 已经选了 \(j\) 个
这里, 第二个就是钦定
如果只是最优化某个值,第一个状态定义是完全可用的
但当我们统计方案数时, 使用第一个状态定义就会算重, 使用第二个就不会
T2
根号分治 ????
容斥 ????
见 Solution.pdf 上的笔记
T3
平凡的线段树
稍微推一推区间合并即可
#7.梦熊模拟赛
唐诗比赛。
不好评价
T1 想出了正解
但是板子挂了, 于是我也挂了
T1
欧拉回路
通过简化 dp 转移自动机, 可以把问题转化为求自动机上的欧拉回路
然后就做完了
你说的对, 但是没有当前弧优化的欧拉回路是假的
于是 T 的跟贪心一个分 (????)
我的一个花两小时想欧拉回路的朋友破防了
T2
有个人对分式求和的时候, 同时对分子和分母进行求和了
破防了。
T3
跟 #3 的 T5 挺像的
决策点只能有 \(n ^ 2\) 个
枚举中位数即可
#8.梦熊模拟赛
好啊好啊
T1
正解很困难, 并且依赖排列随机生成这一性质
但是可以转化为静态区间 \(k\) 小, 主席树直接秒了其中的 90pts 了
T2
80 pts 的 \(\text {dp}\) 非常好想
并且似乎有一定扩展空间 (?)
T3
数位 dp
剪枝 !
并且, 在不顶上下界的时候, 答案可以直接得出 (通过组合计数的方法)
#9.ABC 363
好啊好啊, ABC 只会 ABC
滚回去学 whk 罢
D
其实想出了正确的思路
但是写出了一坨石山
我们考虑直接枚举长度
会发现增长速度非常快, 于是就能非常快的跳到 \(10 ^ {18}\)
然后剩下全是细节, 建议形式化的写出来, 防止再次写出石山
#10.CF
好啊好啊
把 RE 看成 WA
#11. ABC 364
上分最爽的一集
D
发现是二分
如果二分第 \(k\) 大的数距离 \(x\) 的距离 \(r\) , 显然具有单调性
于是, 只需要找包含大于等于 \(k\) 个数的最小 \(r\) 即可
然后怎么算区间内有多少个数呢 ?
有个学数据结构学傻的同学使用了动态开点线段树
直接 lower_bound 之类的即可
#12. 梦熊模拟赛
T1
同余最短路
的板子 (?)
T2
叹为观止
实在是太妙了
首先, 由题意知 \(\sum\limits_{i = 1}^{n} A_i = \sum\limits_{i = 1}^{n} B_i = m\)
接下来, 对要求的式子做些变换
原式为 \((\sum\limits_{i = 1}^{n} \left| A_i - B_i \right|) ^ 2\)
我们先化简底数
于是, 取值实际上仅与 \(\sum\limits_{i = 1}^{n} \min \{A_i, B_i\}\) 有关
不妨设 \(s = \sum\limits_{i = 1}^{n} \min \{A_i, B_i\}\)
考虑钦定 \(s\) 后, $ \min {A_i, B_i} $ 对 \(s\) 的贡献方案数
等价于把 \(s\) 拆成 \(n\) 个非负整数的和
等价于把 \(s + n\) 拆成 \(n\) 个正整数的和
容易使用插板法得出方案数为 ${(s + n) - 1} \choose {n - 1} $
然后, 我们需要保证 \(\sum\limits_{i = 1}^{n} A_i = \sum\limits_{i = 1}^{n} B_i = m\)
等价于把 \(m - s\) 分别分配给 \(A\) 和 \(B\)
但是我们发现, 对于某个 \(i\) , 不能同时增大 \(A_i\) 和 \(B_i\) , 否则他们的 \(\min\) 就会发生变化
不妨设有 \(A_i\) 增加了 \(x\) 处, 方案数为 $ {n} \choose {x} $
那么要把 \(m - s\) 分配给这 \(x\) 处 (每处都必须分配), 方案数为 $ {(m - s) - 1} \choose {x - 1} $
再把 \(m - s\) 分配给剩余的 \(n - x\) 处 (不一定都要分配), 方案数为 $ {(m - s) + (n - x) - 1} \choose {(n - x) - 1} $
总的结果为
#13. MX-X2
T1
开场 5min 就注意到了原问题等价于判断能不能构成等差数列
(此时 xhr 还在因为注意不到这个性质而愤怒的砸着桌子)
这是容易判断的, 只需要判断排序后 $ \frac{a_i - a_{i - 1} } { p_i - p_{i - 1} }$ 是否是一个定值即可
飞速地过了样例
交上去 WA 0pts
机智 的我很快注意到这个公差可能是小数
于是我把存公差的变量改为了 double
喜提 WA 20pts
改成 long double 以后喜提 WA 50pts
于是我坚定的认为我是被卡精度了
于是我就想到了把这个公差放在模意义下, 碰撞的概率大概是 \(\frac{1}{mod}\)
于是把公差放在模 \(1e9 + 7\) 意义下, 发现仍然 WA 50pts
于是我坚定的认为这个模数被卡了, 把模数换成 \(998244353\), 发现仍然 WA 50pts
急了
鬼故事: 去外面游荡一圈发现 xhr 在写 T3
急了
于是我抢走他的鼠标, 查看他 T1 的代码
发现他完全没处理小数居然过了
急了
然后才注意到如果公差是小数, 那么一定无解
我是唐氏。
T2
注意了好长时间才发现性质
对于一个 \(j\), 一个 \(i\) 合法当且仅当
-
\(a_i\) 最高位与 \(a_j\) 最高位butong
-
在 \(a_i\) 最高位处 \(a_j\) 为 \(1\)
拆位统计就做完了
#14. MX 炼石 #1
T1
考虑如何凑出一个 \(x\)
最暴力的方法是, 每次执行 1 操作, 然后执行 + 操作
但这种做法太唐了, 我们甚至没有使用 c 操作
容易观察发现, c+ 相当于把原数乘 \(2\) , 1+ 相当于把原数加 \(1\)
很难不想到使用类似快速幂的思路, 在 \(O (\log n)\) 次内得到 \(x\)
考虑把这个做法扩展到凑出一个序列 \(b_{1 \cdots n}\)
我们发现, 每次 + 操作会使前面的数减 \(1\)
但我们又发现, 我们其实没有什么决策的空间, 因为我们已经尽力使 + 操作变得最少
于是我们可以倒着考虑, 记 tot 为后面对前面的减 \(1\) 次数
对于 \(b_i\) , 我们凑出 \(b_i + tot\) 即可
T2
怎么一车神秘 poly 做法啊
不会 poly 被爆了
我们考虑, 假设我们拥有这个序列的频次柱状图
那么众数出现次数就是最高的那根柱子的高度
于是我们可以考虑枚举高度, 并对柱状图计数
但是这样是假的, 因为每个柱状图可能对应多个序列
不妨设 \(i\) 出现次数为 \(c_i\)
容易得出这个柱状图对应的序列的个数为 \(\frac{k!}{\prod c_i!}\)
这里实际上是一个 多重集排列数 而不是多重集组合数, 并不需要容斥, 场上就因为这个被秒了
于是我们把问题转化为, 对所有和为 \(k\) 的序列 \(c_i\) , 统计 $\frac{k!}{\prod c_i!} \max c_i $
不妨考虑钦定 \(\max c_i = C\) 后对所有 \(\sum c_i = k\) 统计 \(\frac{k!}{\prod c_i!}\)
容易想出来一个 dp, 设 \(f_{i, j}\) 为填到 \(c_i\) , 已经填了 \(j\) 个单位
转移也是容易的: $f_{i, j} \leftarrow f_{i - 1, j + x} \cdot \frac{1}{x!} $
其 \(x\) 为当前这一位填了什么, 满足 \(j + x \leq C\)
所以这样 dp 实际上是对 \(\max c_i \leq C\) 进行计数, 想把她转化为 \(\max c_i = C\) 并不困难, 只需要减去 \(\max c_i \leq C - 1\) 的答案即可
但这样对一个 \(C\) 进行 dp 是 \(\mathcal{O (n k ^ 2)}\) 的
总复杂度为 \(\mathcal{O (n k ^ 3)}\)
#15. MX NOIP #8
T1
读错题了 /kk
但是很快就发现了,
注意到 \(\left\lfloor \frac{x}{3} \right\rfloor = \frac{x - x \bmod 3}{3}\)
因此我们就把下取整给去掉了
这是好的
\(x \bmod 3\) 是容易算的, \(x \bmod 1e9 + 7\) 也是可以算的
而在模 \(1e9 + 7\) 意义下的 \(\frac{1}{3}\) 也是容易算的
其中,
-
\(\sum\limits_{i = l}^{r} 2^i\) 容易使用等比数列求和公式计算
-
\(\sum\limits_{i = 1} ^{r} 2^i \bmod 3\) 是非常有规律的,
打表可知 \(2, 1, 2, 1, 2, 1 \dots\)
因此容易推出前缀和计算公式, 然后前缀和相减即可
T2
数数 /jk/jk
Observations
-
每个位置独立, 只要把每个位置都变回她们自己即可
-
每个数的变化存在循环节
-
把所有数都变回自己的最小步数为所有数最短循环节的 lcm
-
建图以后, 在同一个环上的数的最短循环节相等且都等于环的大小
-
建图以后, 图上的所有环的大小之和为 \(m\)
这不废话吗
假做法
lcm 是不是, 那我们就拆位! 拆位! 拆位! 对每个质因子分别处理
这样就把 lcm 的期望转为了最大值的期望
了吗?
注意到每个质因子不独立, 而期望满足可乘性的条件是每个变量独立
爆炸了
真做法
首先有一个经典的小 trick, 和为 \(m\) 的一些数, 这些数的种类数是 \(\mathcal{O(\sqrt{m})}\) 级别的
具体地, 设 \(siz_i\) 表示第 \(i\) 个环的大小。
根据观察 5 , 我们知道 \(\sum siz_i = m\) , 那么结合上面的 trick, 得出 \(siz_i\) 的种类数 \(\mathcal{O(\sqrt{m})}\) 级别的
再根据观察 4 , 我们知道最短循环节的种类数也是 \(\mathcal{O(\sqrt{m})}\) 级别的了
注意到一些数的 lcm 只与这些数的种类有关
不妨把所有的数按照她们的最短循环节大小划分成 \(\mathcal{O (\sqrt{m})}\) 个等价类
可以 \(\mathcal{O(2 ^{\sqrt{m}})}\) 枚举有哪些等价类中的数出现在了 \(a\) 中
#16. MX 炼石 #2
这就是炼石吗, 好难 /kk/kk
获得了整整 40pts
T1
不是哥们, 这真的不是省选 D1T1 吗
Sub0
一眼可以看出 \(\mathcal{O(n!)}\) 的做法, 可以获得整整 10pts
Sub1
\(n = m\) , 直接判一下, 又可以获得整整 10pts
Sub2
\(m = 0\) , 没有前缀限制
神秘思路
场上想了 2.5h /kk
考虑 \(a_i = i\) 的序列是必然合法的
再考虑每个
聪明思路
考虑
-
逆序对数为冒泡排序交换次数下界, \(\sum\limits_{}\)
-
\(\sum\limits_{i = 1} \max \{ i - a_i, 0 \}\) 为冒泡排序实际操作次数
#17. MX 炼石 #7
数数场。
一题不会
唐完了。
T1
给定 \(s\) 和 \(t\)
首先来考虑对于给定的 \(s\) 和 \(t\) 怎么做
诈骗。
记该问题为 \(f(s, t)\)
唐氏证法
感受到到一个性质,好像中转点至多只需要一个
但是怎么证明呢?
记 \(x\) 为距离 \(s\) 最远的点
记 \(k\) 为 \(s\) 和 \(t\) 和 \(x\) 三个点的 lca
考虑把树以 \(k\) 为根定型
在新树上,\(dis(s, t) = dep_s + dep_t\)
若把 \(x\) 作为仅有的一个中转点,则答案为 \(\min\{ dep_u + dep_x, dep_v + dep_x \}\)
接下来证明只需要 \(x\) 一个中转点即可
假设需要另一个中转点 \(y\)
那么答案为 \(\min \{ dep_u + dep_x, dep_v + dep_y, dis(x, y) \}\)
因为显然有 \(dep_x \geq dep_y\),所以答案一定不能更优
证毕。
那么对于一组 \((s, t)\) 显然答案为 \(\min\{ dis(s, x), dis(t, x) \}\)
接下来容易发现 \(x\) 是树上直径的两个端点中的一个,记两个端点分别为 \(u\) 和 \(v\),则 \(dis(s, x) = \max\{dis(s, u), dis(s, v)\}\)
为了简洁,记 \(w(p) = dis(p, x) = \max\{dis(p, u), dis(p, v)\}\)
注:
\(w(p)\) 的意义是 \(p\) 在树上可以走到的最远的距离
后面其他证法也会用到,不再重复定义
显然求出直径以后,\(w(p)\) 可以线性预处理
最终 \(f(s, t) = \min \{ w(s), w(t) \}\)
喵喵做法
考虑距离一个点最远的点一定是直径的两个端点之一
记直径两个端点为 \(u\) 和 \(v\)
下面证明 \(f(s, t) = \min\{ w(s), w(t) \}\)
首先发现这个东西是必然是答案的上界,因为树上无论如何都走不出比这更长的路径
接下来给出构造性证明,来证明这个值一定能取到
最小化中转点的数量其实是没有意义的
因此在构造中我们并不最小化中转点的数量
记 \(s'\) 为距离 \(s\) 最远的点,\(t'\) 为距离 \(t\) 最远的点
-
若 \(s'\) 和 \(t'\) 是同一个点,那么让这个点作为唯一的中转点
-
若 \(s'\) 和 \(t'\) 不是同一个点,让 \(s'\) 和 \(t'\) 两个点作为中转点
此时答案为 \(\min\{dis(s, s'), dis(s', t'), dis(t', t)\}\)
中间的 \(dis(s', t')\) 显然不会让答案变劣,因为他们是直径。
因此我们也得到了 \(f(s, t) = \min\{ w(s), w(t) \}\) 的结论
题解证法
容易观察到 \(f(s, t) = \min\{ w(s), w(t) \}\) 成立。
证毕。
混 乱 邪 恶
计数
我们要求 \(\sum\limits_{s = 1}^{n}\sum\limits_{t = 1}^{n} f(s, t)\)
发现她等于 \(\sum\limits_{s = 1}^{n}\sum\limits_{t = 1}^{n}\min \{ w(s), w(t) \}\)
我们发现 \(w\) 或者说 \(f\) 的取值只有 \(n\) 种,也即 \(w\) 的值域为 \([1, n]\)
从本质上看,我们是要对只有 \(n\) 种元素但大小为 \(n ^ 2\) 的可重集求和
很自然的想法是,枚举这 \(n\) 种元素,统计每种元素出现的次数,然后求和即可
也就是说我们考虑枚举 \(\min\{ w(s), w(t) \}\) 的值,然后统计产生贡献的次数
我们不妨枚举一个 \(w(s)\),容易发现只有满足 \(w(t) \geq w(s)\) 的 \(t\) 才可以和 \(s\) 凑成一对,产生贡献
那么如何求有多少个满足条件的 \(w(t)\) 呢?
值域线段树
值域树状数组
求这个东西其实等价于求一个数的排名
对于离线求排名问题,我们直接把 \(w\) 从小到大排序,\(w\) 后面的元素的数量即为 \(w(s)\)
原题目中求的是有序数对 \((s, t)\),因此要把贡献次数乘二
另有一个小细节,\(w\) 可能产生相等的情况,这时候刚才进行的乘二就会把一小部分东西算重
设两个相等的 \(w\) 为 \(w_1\) 和 \(w_2\)
在刚才的计数过程中,我们枚举到 \(w_1\) 的时候认为 \(w_2\) 和 \(w_1\) 组成一对产生贡献
同时我们枚举到 \(w_2\) 的时候认为 \(w_1\) 和 \(w_2\) 产生贡献
如果就此打住,那么我们没有算重
但是我们又把方案数乘上了 \(2\),这下爆了
我们考虑给相等的元素随机赋权,排序时以 \(w\) 的值为第一关键字,随机权值为第二关键字进行排序
那怎么保证不重不漏呢?
我们前面算贡献次数的时候相当于在算无序数对 \((s, t)\) 的数量,再乘二得到有序数对的数量
为了得到无序的效果,我们钦定随机权值小的 \(s\) 和随机权值大的 \(t\) 配对
这样,我们在考虑 \(w_1\) 的时候认为 \(w_2\) 可以和 \(w_1\) 产生贡献,但是在考虑 \(w_2\) 的时候并不认为 \(w_1\) 可以和她产生贡献
上面这一段话的人话翻译:直接调用
sort不用去重,排序后第 \(i\) 个数 \(w_i\) 能产生贡献的数对的个数为 \(n - i\)因为随机赋权其实时不得已的行为,我们只是希望获得一个顺序
#18. MX-S4 CSP-S 模拟赛
两佰昏!
赛后看了一下T3,又拿到五十分
交换比特,共同庆祝。

浙公网安备 33010602011771号