SWERC 2020 题解
Record
Solved | Penalty | A | B | C | D | E | F | G | H | I | J | K | L | M |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
8 | 1044 | \(\color{green}{\texttt{+1}} \\ \tiny\textit{00:12}\) | \(\color{green}{\texttt{+}} \\ \tiny\textit{04:58}\) | \(\color{green}{\texttt{+}} \\ \tiny\textit{01:35}\) | \(\color{green}{\texttt{+}} \\ \tiny\textit{00:19}\) | \(\color{green}{\texttt{+}} \\ \tiny\textit{00:54}\) | \(\color{green}{\texttt{+1}} \\ \tiny\textit{03:40}\) | \(\color{green}{\texttt{+2}} \\ \tiny\textit{02:55}\) | \(\color{green}{\texttt{+3}} \\ \tiny\textit{00:31}\) |
A - Gratitude
签到,开个 map,然后排个序即可。
C - Safe Distance
哈哈,签到题被我搞成绝杀。
一开始想了还以为要二分答案平面图转对偶图,然后我不会写这玩意,就扔那了,觉得应该有更好做法。
最后发现果然有。考虑答案一定属于所有点对间的距离(的一半),以及所有点到边界的距离其中一个值。考虑将这些东西看成边,距离看做边长,然后下、右边界,上、左边界看成两个点 \(s,t\)。我们从小到大加入这些边,直到加入这条边后 \(s,t\) 连通就停下,答案就是这条边的长度。
复杂度 \(O(n^2\log n)\),比二分做法简单很多。
D - Jogging
观察得知:规定每天恰好多用一条边必然可以最优。原因非常显然,具体的,我们一定是从距离近的用到距离远的。
还有一个观察:原路返回必然不比绕圈劣。
那么就很好搞了:我们跑出每个点的最短路长 \(\textit{dist}\),对于一条边 \(u,v(\textit{dist}(u) <\textit{dist}(v))\),我们能用它的充要条件是 \(\textit{dist}(i) \times 2 <R\)。
于是最后就跑个最短路。复杂度 \(O(m\log n)\)。
E - Cakes
签到。答案就是整除一下取个最小值。
F - Mentors
简单 dp。考虑设 \(f(i,j)\) 表示前 \(i\) 个点构成 \(j\) 棵树的森林的方案数。
那么新加入一个点 \(i+1\),有三种操作方案:
- 作为森林中一棵新的树:\(f(i,j)\to f(i+1,j+1)\)。
- 选择一颗树并作为新的树根:\(f(i,j)\times j \to f(i+1,j)\)
- 选择两棵树联立并作为新的树根:\(f(i,j) \times {j\choose 2} \to f(i+1,j-1)\)
注意新加 \(r\) 点时只有第一种转移。
复杂度 \(O(n^2)\)。
G - Decoration
口胡一下,不写了!
看到第三个条件:\(s_{i+1}\equiv s_i + \sigma_0(s_i)\pmod n\)。冷静一下发现 \(s_i\) 确定那 \(s_{i+1}\) 也是确定的。如果让 \(x\) 向 \((x+\sigma_0(x))\bmod n\) 连边,就构成了一个内向基环树(森林)。
接下来就是要求一条编号和最小的一条有向路径满足点不自交。
然后可以倍增了,复杂度 \(O(n\log n)\)。看范围应该是有个线性做法但懒得想了。
H - Figurines
本质上要求在线询问某个历史集合中 $\ge $ 某个数的个数。
这就没意思了,直接可持久化线段树就行,\(O(n\log n)\)。
I - Emails
挺玄妙的一道题。
分析性质,设图上最长路长为 \(d\),那么答案即为 \(\lceil \log_2 d \rceil\)。然而我们并没有什么优秀的求这玩意的方法。
于是怎么办呢?我们随机化!考虑每次随机一个点,然后跑 bfs,找到最远点再跑,这样搞五六轮,然后再随机一个点,卡个 clock。然后就过了,真是震撼不已。
VP 之后更是大受震撼。结论,设任一点的最短距离最远点为距离为 \(d'\),那么有 \(d\in [d', 2d']\)。证明很简单:反证,反之则存在最长路上一个点,满足最长路与其较远端长度 \(>d'\),那么该点最远点就不是 \(d'\)。于是得证。
这东西对 \(\log_2\) 就很有用:我们任意一个最远距离,一定和真实最长路不差两倍,那么取对数后就相差不超过 \(1\)。而答案可以允许这点错误,于是输出 \(\lceil\log_2 d\rceil+1\)。
一开始还以为这个差错是因为懒得判细节 事实说明随机化 yyds
K - Unique Activities
用 SAM 光速草了,太搞笑了。
结果发现就一哈希二分答案。
L - Restaurants
就你叫阅读理解题啊
题意简述:\(n\) 个人 \(m\) 个餐厅,每个餐厅有一个容量 \(c_i\)。每个人预定了若干餐厅并按偏好顺序排好序,每个餐厅对预定的顾客又有一个优先级。一个分配方案是合法的当且仅当每个顾客 \(c\)-餐厅 \(r\) 的配对,都满足不存在另一家有空位的餐厅 \(r'\),相比 \(r\),\(c\) 更偏爱 \(r'\);或存在一个尚未入座的顾客 \(c'\) 在餐厅 \(r\) 中优先级比 \(c\) 高。求出最多有多少顾客可以入座。
原来就是稳定婚姻匹配……考虑顾客主动求座:每个餐厅维护一个候选列表,一开始将 \(n\) 个顾客放入队列,每次取出一个,尝试一家尚未尝试过且最偏向的一家餐厅。先塞入该餐厅的候选列表,然后如果列表超出容量则弹出一个优先级最低的顾客,这位顾客重新入队再去别的餐厅尝试。
感觉复杂度玄学,不会算但是过了。
本文来自博客园,作者:-Wallace-,转载请注明原文链接:https://www.cnblogs.com/-Wallace-/p/sol-swerc2020.html