一些 USACO 的题

[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 cd,要求早于 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 c1c2,问变成 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] [tlux,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)

代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
USACO (美国计算机奥林匹克竞赛)是一个广受欢迎的竞技性计算机编程比赛,对于新手来说思维是一个很好的起点。思维旨在培养学生的创造力、逻辑思维和问解决能力。 对于USACO的新手思维来说,我认为有几个重要的方面需要考虑。首先是理解目,要准确地理解目的要求和限制条件,包括输入输出格式、数据范围等。这样可以避免在解过程中产生偏差。 其次是分析问,要尽可能地通过例子和测试样例来观察和揭示问的规律和特点。通过发现并解决子问,逐步推导出正确的解决方法。可以使用逻辑推理、数学推导等工具辅助分析问。 第三点是编程实现,根据经验和理解,选择合适的编程语言和算法进行实现。在代码编写过程中,注重代码的可读性和简洁性,合理利用变量和函数,避免重复代码和冗余操作。合理使用循环、条件判断等结构,确保程序的正确性和高效性。 最后是测试和调试,通过输入不同的测试样例来验证程序的正确性。特别是从边界条件和极端情况考虑,检查是否有错误或潜在的漏洞。当发现问时,要运用调试工具和技巧来找出错误的原因,并对代码进行相应的修改和优化。 总之,USACO新手思维是一个很好的锻炼编程思维和能力的机会。通过认真理解目、分析问、编写实现和测试调试,可以有效地解决这些思维,提升自己的编程水平。随着不断的练习和积累,我相信每个新手都能够在USACO竞赛中进一步成长和取得更好的成绩。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值