[USACO23OPEN] Field Day S
题意:对每个 G-H 字符串,求其他字符串与其最小差异字符个数。
远古的回忆。
把变换一个字符视为边权为 1 1 1 的边,即求最长路。
最长路不好搞,考虑转补集最短路(容易感性理解),BFS 即可。
[USACO23FEB] Moo Route II S
题意: n n n 个机场, m m m 条航线。每条航线 ( c , r , d , s ) (c,r,d,s) (c,r,d,s) 表示位置 c → d c \to d c→d,要求早于 r r r 时刻起飞,在 s s s 时刻到达。每个机场有 a i a_i ai 表示到 i i i 后必须停留 a i a_i ai 时间。初始于 1 1 1 号点,求每个点的最早到达时间。
比较有意思。
无法保证每个点只被访问一遍,而此题每条边显然不会重复走,考虑保证每条边仅走一次。
一种 naive 的想法就是标记边是否走过。举个例子:
for(int i=1; i<=n; i++)
if(i > 0) continue;
仍然是 O ( n ) O(n) O(n) 的。。
然后就考虑每次只访问有必要的边。对 u u u 出边按 r r r 排序,二分找出当前时间下还有必要访问的边。排序后访问到一条走过的边,显然就不用继续遍历接下来的出边了。
每次访问
u
u
u 的时间不断减小,由图,访问边的复杂度显然为
O
(
m
)
O(m)
O(m)。
总时间复杂度 O ( m log m ) O(m \log m) O(mlogm)。
[USACO23OPEN] Milk Sum S
题意:给定 a i a_i ai,求一个 n n n 的排列 p p p 最大化 ∑ i = 1 n p i × a i \sum_{i=1}^n p_i \times a_i ∑i=1npi×ai。
一眼秒的题。
显然应当从小到大排。
每次询问考虑维护住顺序,分讨变大变小,二分找位置,维护前缀和即可。
[USACO22DEC] Feeding the Cows B
题意:给定长为 n n n 的 G-H 牛序列,求草最少的一个 G-H 草序列,使得每头牛到最近草具体不超过 k k k。
不擅长这种简单题。贪心。
每次尽可能往后填,填不了了一定是 n n n 处,往前找空即可。填的位置也一定是单调增的。
[USACO23JAN] Find and Replace S
题意:给定字符串 S , T S,T S,T,每次操作选定 c 1 , c 2 c_1,c_2 c1,c2 将 S S S 中所有 c 1 → c 2 c_1 \to c_2 c1→c2,问变成 T T T 的最小操作次数。
首先 S S S 向 T T T 建边。
显然的:出度 > 1 >1 >1 无解。
考虑最小次数,对于每一个子图,有出度 ≤ 1 \le 1 ≤1,故形态仅有以下情况:
自环无需操作;链的情况自底向上依次变换即可;纯环的情况需引入临时字母 t t t 破环为链,其中 t t t 不属于环,操作数为 ∣ E ∣ + 1 |E|+1 ∣E∣+1;基环树的情况可以令 t t t 为与环相连的点,操作数为 ∣ E ∣ |E| ∣E∣。
由上可得, T T T 中有 52 52 52 种字符时当且仅当 S = T S = T S=T 时有解。若 T T T 没有 52 52 52 种字符,则一定存在用于破环为链的字符。
故本题找纯环即可。
实现:先用拓扑找出链上的点,剩下的点均为环上的点,后 dfs 判断是否为纯环。
[USACO22OPEN] Balancing a Tree G
题意:给定一棵树,给每个点赋一个 [ l i , r i ] [l_i, r_i] [li,ri] 的点权。定义不平衡度为结点到其祖先点权差的最大值。求一种方案使不平衡值最小。
二分答案 x x x。
可以证明某个点合法的取值一定为一段区间。
记 [ t l u , t r u ] [tl_u, tr_u] [tlu,tru] 表示当 s u s_u su 在这个范围内时,存在一种方案使得 u u u 子树的不平衡度 ≤ x \le x ≤x。记 [ l o w e r u , u p p e r u ] [lower_u,upper_u] [loweru,upperu] 表示 u u u 子树对祖先的限制,即祖先在这个范围内时才可能使 u u u 子树内存在方案。
判断合法性,自下而上不断求对祖先的限制。
则 s u s_u su 应在所有子树内点 l o w e r , u p p e r lower,upper lower,upper 的交集范围内(只用考虑儿子即可)。 t l u , t r u tl_u,tr_u tlu,tru 即将此与 [ l u , r u ] [l_u,r_u] [lu,ru] 取交集, l o w e r u , u p p e r u lower_u,upper_u loweru,upperu 即将此与 [ t l u − x , t r u + x ] [tl_u-x,tr_u+x] [tlu−x,tru+x] 取交集。
输出方案也是容易的。根节点在 [ t l u , t r u ] [tl_u,tr_u] [tlu,tru] 内任取,自上而下求对后代的限制即可。
时间复杂度 O ( n log V ) O(n \log V) O(nlogV)。
[USACO23JAN] Lights Off G
题意:见题面。灯的状态,开关的状态,每次改变一位开关状态,开关的状态会向右移。
有点妙的。
首先答案是 O ( n ) O(n) O(n) 的。 T T T 次询问的 n n n 均相同,最后可能是枚举答案,考虑预处理。
由于灯的末状态固定,大概是预处理灯的状态。
考虑如何消除开关的影响。假设初始开关状态给定为 A A A,此时构造一个初始状态为 0 0 0 的开关 B B B,每次 A A A 仅右移,每次 B B B 改变一位然后右移,开关的实际效果由 A , B A,B A,B 共同产生。枚举步数,判断 A , B A,B A,B 能否关灯,步数固定时 A A A 状态固定。
故自然的设计出 f ( i , S ) f(i,S) f(i,S) 表示 i i i 步是否能将 B B B 开关变为 S S S。考虑消除移动的影响,每次改变单个开关可以视为改变一段开关的状态,转移便很容易了。做了这个转换后,可以证明 B B B 可以在 n n n 步以内变成任意一种状态,因此答案上界为 n n n。
时间复杂度 O ( n 2 2 n + T n ) O(n^22^n+Tn) O(n22n+Tn)。