「Solution Set」06/16
要没学上力!
P9340 [JOISC 2023 Day3] Tourism
trick:求虚树覆盖联通块的大小:将关键点按 dfn 排序,所覆盖到的边数为相邻两个关键点之间的边数和除以二(假设第一个和最后一个相邻)
然后我们考虑回滚莫队,先把所有关键点弄下来按 dfn 排序,然后删掉点的时候就用链表计算贡献。
完事了就、
P9338 [JOISC 2023 Day3] Chorus
好题好题。
我们考虑怎样判断一个序列能不能唱。因为如果分的歌曲数量越多,是越容易组成队伍的。如果分的歌曲数量少于 \(K\) 的话,那随便拆几个就行了。
所以判断我们是会了,我们考虑怎样设计 DP 状态。
\(f_{i,j}\) 表示前 \(i\) 只母河狸,总共唱了 \(j\) 首歌的最小代价。显然的是一首歌肯定是由连续的几只母河狸和连续的几只公河狸组成,而如果存在公河狸在母河狸前面,就需要把它换到后面去。所以设 \(cnt_i\) 表示第 \(i\) 只母河狸前面有多少只公河狸。假设第 \(k\) 只母河狸到第 \(i\) 只母河狸要组成一首歌,对于任意一个母河狸 \(l\),如果 \(cnt_l\geq k\),那么就需要把多出来的这些公河狸都扔到后面去。否则不用管,后面需要匹配的公河狸是不用动的。
所以说了半天,DP式子是 \(f_{i,j}=\min\limits_{k=0}^{i-1} {f_{k,j-1}+\sum\limits_{l=k+1}^i \max (0,cnt_{l}-k)}\)
然后我们感性理解一下啊。就是越多的歌曲数目代价总是越小的。所以我们考虑 wqs 二分。。。。
然后我们考虑去求这个式子。
然后不会了正确的做法是求助伟大的红日
我们考虑设 \(pos_i\) 表示第一个 \(cnt_j\geq i\) 的位置 \(j\)。
假如转移的时候 \(pos_j>i\),那么就直接转移就行。
否则就是 \(f_{i}=\min f_{k}+sum_{i}-sum_{\max(pos_k,k)}-(i-\max(pos_k,k))\times k\)
然后这个可以随便斜率优化一下。然后就能做了。
P9342 [JOISC 2023 Day4] Bitaro's Travel
发现如果需要连续的调转方向的话,那么一定是另外一侧的距离大于之前走过的所有距离之和,才会调转方向,所以如果想转弯的话,那么最多会转 \(\log V\) 次,所以我们可以寻找每次它在什么地方转弯。
这个可以二分答案,每次二分一下到哪里就行。
P8078 [WC2022] 秃子酋长
就是不删除莫队,用一个链表维护所有的相邻的位置。然后直接删除就行。
人傻常数大了属于是。调不过了
loj3685. 「JOISC 2022 Day1」监狱
首先我们感性理解:每名囚犯一定是依次走到自己的目的地的。因为如果起点或终点挡着别人的路,让他先走到目的地就行了。而在中间的话还容易挡着别人的路。
所以如果一个人的起点在另一个人的路径上,那么这个人必须先走,如果一个人的终点在别人的路径上,那么这个人必须后走。
然后就随便用树剖加线段树维护一下就行。
为什么我几个月前写了一遍这个还没过当时却死活想不出来为什么明明这题很简单的啊
不想写了好困啊