USACO 题目学习

P15576 [USACO26FEB] Good Cyclic Shifts G

题面:

对于一个 \(1\dots N\) 的排列 \(p_1,p_2,\dots,p_N\)(\(1\le N\le 2\cdot 10^5\)),定义 \(f(p)=\sum_{i=1}^N \frac{|p_i-i|}{2}\)。如果一个排列能够通过至多 \(f(p)\) 次相邻元素交换变为 \(p_i=i\)(恒等排列,identity permutation)的排列,则称该排列是 好的。

给定一个排列,找出它的哪些循环移位是好的。

题解:

这个之前给同学讲过了,直接记录多少个数在数轴左边多少个在右边,然后树状数组维护即可。

* P15578 [USACO26FEB] Random Tree Generation G

题面:

假设函数 \(\text{randint}(l,r)\) 独立均匀随机返回区间 \([l, r]\) 中的一个整数。

贝西通过以下两步过程生成一个具有 \(N\) 个顶点(\(2 \le N \le 2\cdot10^5\))的随机带标号树:

  • 从标号为 \(1\) 到 \(N\) 的顶点开始。对于每个 \(i\) 从 \(2\) 到 \(N\),在顶点 \(i\) 和 \(\text{randint}(1,i-1)\) 之间添加一条边。
  • 均匀随机选择 \(\{1, 2, \ldots, N\}\) 的一个排列 \(p_1,p_2,\dots,p_N\)。将每个顶点 \(v\) 重新标记为 \(p_v\)。

现在,农夫约翰正在观察最终树的边集,他想知道上述两步过程恰好生成具有该边集的树的概率。你能确定这个概率对 \(10^9+7\) 取模的结果吗?

题解:

这个有实力,当时确实没做出来。

最后如果正好是那个生成树,并且根节点是 \(r\),那么父子关系先要确定。

保证对于每个 \(u\) 都让自己子树中的 \(v\) 在前面,发现概率是 \(sz(v)^{-1}\)。

由于还要求父亲比儿子出现更早,所以概率是 \((n - 1)!^{-1}\)

答案就是 \(\sum_{r = 1}^n (n - 1)!^{-1}\prod_{x = 1}^n sz_r(x)\)。

统计答案换根即可。

P14981 [USACO26JAN1] Milk Buckets G

看了龙猫题解,感觉有实力。

观察发现最后只有单谷才合法,然后考虑需要多少次交换才能变成单谷。设计势能函数:

\[E = \sum_{i = 1}^n \min(f_i, g_i) \]

其中 \(f_i\) 表示 \(i\) 向左更小的数的数量,\(g_i\) 表示向右更小的数的数量。

每次交换 \(E\) 一定可以有一个位置使得 -1,并且最多 -1,所以答案就是 \(E_0\)。

* P11674 [USACO25JAN] Reachable Pairs G

这种题为啥没想出来呢?

看了第二篇题解,Ri 的,感觉也很有实力。

做法就是因为 1 操作不会改变连通性,所以说只是不算贡献。

倒着做的时候可以维护每个连通块 0 的数量,然后带权并查集启发式合并。

[USACO26JAN1-S] Sliding Window Summation

依旧类似于反悔贪心的算法,有点像 club。

做法比较明显,因为确定前 \(k\) 个位置中的一个之后可以顺水推舟确定后面以 \(k\) 为周期的位置,所以设 \(val_i\) 是改成 \(i\) 位置 \(0\) 的代价,那么改成 \(1\) 的代价是 \(len_i - val_i\)。

先全部放 \(0\),然后依次放 \(1\) 就好了。

P15259 [USACO26JAN2] Farmer John Loves Rotations S

唐,开始读错题还写完了,结果发现原来是唐。

就是先考虑维护总共 \(n\) 段区间,然后用 set 维护目前覆盖 \(i\) 的区间。

set 用法详见病历本。

posted @ 2026-10-02 11:13  wangcy192  阅读(7)  评论(0)    收藏  举报