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\),这个问题有一万种做法。于是就做完了。

AC Code

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

posted @ 2022-07-20 21:47  云浅知处  阅读(26)  评论(0编辑  收藏  举报