2022.7.19 做题记录
7.20 发现昨天记录忘发了,补上
今天出去办了一堆事啊(比如给新手机办手机卡!!),回家已经挺晚了,随几个萌萌题做两下
CF609E MST for each Edge Present 5
你有一个 \(n\) 点 \(m\) 边的无向图,第 \(i\) 条边 \((u_i,v_i)\) 有边权 \(w_i\)。
对于每条边 \(i\),你需要求出来:包含第 \(i\) 条边的生成树的树上边权之和最小是多少。
\(1\le n,m\le 2\times 10^5\)。
原题目名称叫 Minimum spanning tree for each edge,实在有点长,这里简化了一下=_=
考虑先随便求一个最小生成树,然后加入一条非树边 \((u,v)\) 时,相当于要在树上 \(u\to v\) 路径上选一条边删掉,再加入当前的边 \((u,v)\)。
那么显然我们应该选边权最大的边,问题就转化为链上边权 \(\max\),这个问题有一万种做法。于是就做完了。
CF1706D Chopping Carrots Present 7.0
给定正整数 \(n,k\),对于一个序列 \(p\),满足 \(1\le p_i\le k\),我们称其「代价」为
\[\max\limits_{1 \le i \le n}\left(\left \lfloor \frac{a_i}{p_i} \right \rfloor \right) - \min\limits_{1 \le i \le n}\left(\left \lfloor \frac{a_i}{p_i} \right \rfloor \right) \]你需要求出代价最小的序列的代价是多少。\(1\le n,k\le 10^5,1\le a_i\le 10^5\)。
由数论分块的常见结论我们知道每个 \(a_i\) 只会变成最多 \(O(\sqrt{a_i})\) 种数。
因此把这些数都找出来,类似2021 联合省选 D1T1 卡牌游戏的做法,在值域上做个双指针就行了。
时间复杂度 \(O(n\sqrt{a_i})\),空间复杂度容易优化到 \(O(n)\)。我偷懒没写空间 \(O(n)\) 的做法((
详细看代码:AC Code
场上因为多测没请干净 wa 了,到最后也没调出来。。。垃圾多测
CF510D Fox And Jumping Future 7.5
有 \(n\) 种技能,和一个无限长的纸带。
你可以花 \(c_i\) 的代价学习第 \(i\) 种技能,学习后就可以随时向左或向右跳 \(l_i\) 格(不限次数)。
问你至少要花多少代价才能到达所有地方,无解输出 \(-1\)。
\(1\le n\le 300,1\le l_i\le 10^9,1\le c_i\le 10^5\)。
由 \(\text{Bezout}\) 定理我们知道相当于要选出来若干个数使得它们的 \(l_i\) 的 \(\gcd=1\)。
考虑跑一个类似最短路的东西,每次用 \(c_i+F(x)\) 更新 \(F(\gcd (x,l_i))\),不断进行松弛,\(F(1)\) 就是最终的答案。
粗略分析一下,能到达一个点 \(x\) 当且仅当 \(x\) 是某个 \(l_i\) 的约数,因此总点数大概是 \(O(n\sqrt{V})\)。
实际上大部分情况下 \(d(x)\sim \sqrt[3]{x}\),我们可以直接把点数看做 \(10^5\)。由于 \(c_i\) 均为正,可以使用 \(\text{dijkstra}\)。
复杂度看上去挺对的,反正能过(
AC Code <- 昨天晚上写挂了,调不出来睡了,第二天起来一下子就发现错了2333