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

posted @ 2022-03-30 22:46  云浅知处  阅读(291)  评论(0编辑  收藏  举报