「USACO 2021 US Open」题目选做1

Abstract

XC 说最近要我们把 USACO 的月赛题刷一遍,所以就开了这个坑。

United Cows of Farmer John G

\(\texttt{last}_i,\texttt{next}_i\) 分别为第 \(i\) 头奶牛前、后第一个与它品种相同的奶牛的指标。

枚举合法区间的左端点 \(i\),显然右端点只能在区间 \((i,\texttt{next}_i)\) 内。

\(i<j<\texttt{next}_i\),则 \(j\) 是合法的右端点的充要条件为 \(\texttt{last}_j<i\)

于是我们就将这题转化为了一道主席树的板子题。

Portals G

将每个点 \(u\) 拆成两个点 \(u_1,u_2\)\(u_1\) 与边 \(p_{u,1},p_{u,2}\) 相连,\(u_2\) 与边 \(p_{u,3},p_{u,4}\) 相连。

因为拆除来的所有点度数均为 2,所以建出来的图的每个连通块都是一个环,而我么需要将所有环连起来。

对于点 \(u_1,u_2\),若它们分属两个不同的连通块,我们可以以 \(c_u\) 的代价将这两个连通块合并。

所以我们借鉴 Kruskal 算法的思想,将每个点对 \(c_u\) 从大到小排序,依次考虑每个点拆除来的两个点当前是否在同一连通块中,若否,将 \(c_u\) 计入答案,再将这两个连通块合并即可,用并查集实现。

Permutation G

对于一个排列,它的前三个点连成 1 个三角形,第 4 个点要么在三角形内部,要么与前三个点中的 2 个连成的三角形包含了第 3 个点;

更一般的,第 \(k+1(k>3)\) 个点要么在前 \(k\) 个点中的三个点所构成的三角形内部,要么与前 \(k\) 个点中的 2 个点构成的三角形包含了其他 \(k-2\) 个点。

\(f_{T}\) 表示填完了三角形 \(T\) 内部的所有点,在 \(T\) 外的点的合法排列数。

转移考虑一个更大的三角形 \(T‘\),它与 \(T\) 有 2 个公共点,设在 \(T\) 外的点有 \(x\) 个,在 \(T‘\) 的点有 \(y\) 个,则有 \(x-y-1\) 个点在 \(T\)\(T‘\) 之间。

\(T\)\(T‘\) 之间的点有 \(P(x-1,x-y-1)\) 种排列方式,\(T‘\) 之外的点有 \(f_{T‘}\) 种排列方式,根据乘法原理,\(f_{T‘}\)\(f_T\)\(P(x-1,x-y-1)f_{T‘}\) 的贡献。

考虑每个合法排列的前 3 个点,答案即为 \(\sum_{T}3!f_T=6\sum_{T}f_T\)

United Cows of Farmer John P

考虑一个具有启发性的 \(\mathcal O(n^2)\) 算法:枚举合法区间的右端点 \(r\),再枚举在区间 \((\texttt{last}_r,r)\) 内的左端点 \(l\),显然 \(l\) 对答案的贡献为 \(l\) 是否在该区间重复乘上区间 \([l+1,r-1]\) 的不同的奶牛的品种数。

\(\mathcal O(n\log n)\) 的算法中,我们依旧枚举合法区间的右端点 \(r\),我们发现每个左端点对答案的贡献可拆为一个 0/1 系数与某个值相乘,写一个线段树维护之。

「USACO 2021 US Open」题目选做1

上一篇:WS2812B-64位 8*8位 RGB LED点阵


下一篇:【Django】DRF自定义数据返回格式