AtCoder Beginner Contest 245 (A~G)
ABC245A Good Morning
依照题意模拟即可。Code
ABC245B Mex
依照题意模拟即可。Code
ABC245C Choose Elements
将这些数看做 \(2n\) 个点,然后对每个 \(1\le i<n\),若 \(|a_i-a_{i+1}|\le k\) 则连边 \((i,i+1)\),若 \(|a_i-b_{i+1}|\le k\) 则连边 \((i,n+i+1)\),以此类推。
最后只需要遍历一下这个图就行了。代码中并没有显式地写出连边的过程。或者你说这个是 dp 也没有什么问题。Code
ABC245D Polynomial Division
由于 \(n\) 很小所以可以直接模拟 \(O(n^2)\) 的多项式除法。云浅比较懒,直接贺了板子(
代码就不放了,可以自行搜索「【模板】多项式除法」。
ABC245E Wrapping Chocolate
考虑贪心:对每个 \((A_i,B_i)\),我们应当选择一个满足 \(C_j\ge A_i\) 且 \(D_j\ge B_i\) 的盒子 \(j\) 来装它。
按照 \(A_i\) 从大到小的顺序处理每个巧克力,同时维护一个 multiset
来存满足 \(C_j\ge A_i\) 的所有 \(D_j\) 的值。
对每个 \((A_i,B_i)\),只需要在 multiset
中找到满足 \(D_j\ge B_i\) 且最小的 \(D_j\) 即可。找不到则说明无解。
复杂度 \(O(n\log n)\)。Code
ABC245F Endless Walk
板子题。首先可以注意到一个点能够一直走下去就相当于它能做到一个环里。
考虑缩点,那么对于一个点 \(u\),若其所在 \(\text{SCC}\) 的大小 \(\ge 2\),那么它就可以在自己这个 \(\text{SCC}\) 里面一直转;更一般地,对于一个点 \(u\),若 \(u\) 能在缩点后的 \(\text{DAG}\) 上走到一个大小 \(\ge 2\) 的 \(\text{SCC}\),那么 \(u\) 就满足条件。
缩点后按照拓扑序的倒序进行 dp ,维护一下每个节点后继节点中 \(\text{size}\) 的最大值即可。复杂度 \(O(n+m)\)。Code
ABC245G Foreign Friends
称 popular people 为「明星」。
首先,如果没有「不同国家」的限制,那么我们可以直接新建一个源点 \(T\),从 \(T\) 向每个明星连一条边权为 \(0\) 的边,然后从 \(T\) 开始做 \(\text{Dijkstra}\) 即可。复杂度 \(O(m\log m)\)。
有这个限制怎么办呢?其实也很好做。我们从 \(T\) 开始做 \(\text{Dijkstra}\) 时,如果使用传统的优先队列优化,那么第一批入队的节点就是那 \(L\) 个明星。
我们考虑对每个节点不仅记录当前到这个节点的最短路,同时还要多记录一下「这个节点是由哪个国家的明星扩展而来」。
每个节点第一次被扩展自然就是最短路。
- 如果到这个节点的最短路经过的明星和他一个国家,那么我们就记录一下它已经被同一个国家的人扩展过一次了,接下来再遇到这个节点的时候,如果仍然是从同一个国家的明星扩展过来,那么就可以直接
continue
; - 如果遇到这个节点时扩展他的明星和它不是一个国家,那么这时的路经长就是这个节点的答案。
实际上这个算法本质上就是在记录最短路的同时,求出了「源点到每个节点的 经过的第一条边和最短路不同 的次短路」。
由于每个节点最多被访问两次,时间复杂度仍然是 \(O(m\log m)\)。Code