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
看了龙猫题解,感觉有实力。
观察发现最后只有单谷才合法,然后考虑需要多少次交换才能变成单谷。设计势能函数:
其中 \(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 用法详见病历本。

浙公网安备 33010602011771号