8VC Venture Cup 2017 - Elimination Round
D. PolandBall and Polygon (4s, 256MB)
题目大意:有一个包含 \(n\) 个顶点的凸多边形,其编号按顺时针方向依次为 \(1 \sim n\),且保证其任意三条对角线不交于一点。给定 \(k\) 满足 \((n,k)=1\),现在将如下操作重复 \(n\) 次:每次从当前顶点 \(X\) 跳到其之后的第 \(k\) 个顶点 \(Y\)(\(X+k\) 或 \(X+k-n\)),并连结对角线 \(XY\)。初始时 \(X=1\)。求每次操作连结对角线后多边形将会被划分成多少块区域。
数据范围:\(5 \leq n \leq 10^6\),\(2 \leq k \leq n-2\)
简要题解:首先令 \(k=min(k,n-k)\),显然答案不会发生变化。然后尝试画图寻找规律。注意到只有当所连对角线跨越 \(1\) 号顶点时,加入对角线后新增的区域数才会发生变化。模拟即可。
时空复杂度:\(O(n) - O(1)\)
关键字:规律,模拟
E. PolandBall and White-Red graph (2s, 256MB)
题目大意:有一个简单无向完全图,其中一些边为红色,其余的边为白色。定义该图的鲜艳度为 \(min(d_r,d_w)\),其中 \(d_r\) 为由红色边构成的子图的直径,\(d_w\) 为由白色边构成的子图的直径。图的直径的定义为:图中任意两点之间的最短路的最大值(在该题中视所有边的长度均为 \(1\)),而若图不联通,则认为图的直径为 \(-1\)。求构造一个鲜艳度为 \(k\) 的包含 \(n\) 个顶点的简单无向完全图。
数据范围:\(2 \leq n \leq 1000\),\(k \leq 1000\)
简要题解:注意到一个简单的事实:若图 \(G\) 的直径大于 \(3\),则其补图 \(G'\) 的直径必定小于 \(3\),证明如下:
证明:约定 \(G\) 中的最短路用 \(d\) 表示,\(G'\) 中的最短路用 \(d'\) 表示。设 \(u,v\) 为 \(G\) 中直径的端点,则 \(d(u,v) \geq 4\),而我们要证明的是 \(\forall x,y\),成立 \(d'(x,y) \leq 2\)。注意到,在 \(u,v,x,y\) 中最多存在 \(4\) 个不同的顶点,而 \(d(u,v) \geq 4\),则显然可以将这 \(4\) 个点分为两个集合 \(A,B\),使得 \(\forall a \in A,\forall b \in B\),边\(E_{ab}\) 均不存在。则这样的 \(A,B\) 集合有两种不同的情况:\(\{u,x\},\{v,y\}\) 或 \(\{u,x,y\},\{v\}\)。对于第一种情况,在补图 \(G'\) 中边 \(E_{xy}\) 存在,故 \(d'(x,y)=1 \leq 2\)。对于第二种情况,在补图 \(G'\) 中边 \(E_{xv}\) 和 \(E_{yv}\) 均存在,故 \(d'(x,y) \leq d'(x,v)+d'(v,y)=2\)。综上即证。
由以上事实可知,我们只要找出 \(k=1,2,3\) 时的构造方法即可。
- 当 \(k=1\) 时,显然无法构造
- 当 \(k=2\) 时,令 \(E_{12},E_{23},\cdots,E_{n(n-1)}\) 为红边即可
- 当 \(k=3\) 时,令 \(E_{12},E_{23},E_{34},E_{15},E_{35},E_{56},E_{57},\cdots,E_{5n}\) 为红边即可
注意当 \(n \leq 4\) 时,还有一些特殊情况需要考虑。
时空复杂度:\(O(n) - O(1)\)
关键字:构造,结论
F. PolandBall and Gifts (1.5s, 256MB)
题目大意:有 \(n\) 个人互送礼物,已知第 \(i\) 个人将带礼物送给 \(p_i\),其中 \(p_i \not= i\),且保证 \(\{p_n\}\) 为一个排列。但是我们已经知道会有 \(k\) 个人忘记带礼物。而第 \(i\) 个人会收到礼物当且仅当:
- 第 \(i\) 个人带了礼物
- 第 \(x\) 个人满足 \(p_x=i\) 带了礼物
求最多和最少有多少个人不会收到礼物。
数据范围:\(n \leq 10^6\),\(k \leq n\)
简要题解:注意到任意排列都可以转换成置换形式,那么,在一个循环中,如果当前位置的人没有带礼物,那么对应的下一个位置的人将不会收到礼物。
- 最多:考虑尽可能让同一循环中没有相邻的人同时不携带礼物,按循环的大小分奇偶贪心即可。显然,在大多数情况下,答案会是 \(2k\)。
- 最少:设排列 \(p\) 所分解成的各个循环的大小为 \(c_1,c_2,\cdots,c_m\)。贪心地,若存在 \(c_{a_1}+c_{a_2}+\cdots+c_{a_q}=k\),则答案为 \(k\),否则答案为 \(k+1\)。即问题是要判断是否存在若干个 \(c_i\) 之和为 \(k\)。用普通的背包型动态规划需要 \(O(nm)\) 的时间复杂度,我们可以考虑将循环大小相同的放在一起成为多重背包问题,而用二进制拆分(比如 \(9=1+2+4+2\))优化转移。可以证明,这样复杂度为 \(O(n\sqrt{n})\)。
证明:令复杂度为 \(O(nS)\),令循环大小为 \(k\) 的有 \(cnt_k\) 个,则
又有\(log(x)+1 \approx \sum_{r \geq 0} [x \geq 2^r]\),而对于 \(cnt_{k_i} \geq p(i=1,2,\cdots,l)\) 有
又因为 \(k_i\) 互不相同,故 \(k_1+k_2+\cdots+k_l \geq \dfrac{l(l+1)}{2}\),从而 \(l \leq \sqrt{\dfrac{2n}{p}}\)。故
时空复杂度:\(O(n\sqrt{n}) - O(n)\)
关键字:置换,动态规划,贪心
G. PolandBall and Many Other Balls (6s, 256MB)
题目大意:有 \(n\) 个棋子排成一行,现在将从这些棋子中选出 \(m\) 组,每组包含一个棋子或相邻的两个棋子,且每个棋子最多属于其中一组。求 \(\forall m \in [1,k]\) 有多少种分组方案数。答案对 \(998244353\) 取模。
数据范围:\(n \leq 10^9\),\(1 \leq k < 2^{15}\)
简要题解:考虑最简单的动态规划,令 \(f_{i,j}\) 为从前 \(i\) 个棋子中选出 \(j\) 组的方案数,则转移方程为
但这样复杂度不能满足要求,而注意到可以将前 \(c\) 个棋子分为前 \(a\) 个和后 \(b\) 个,其中 \(a+b=c\),那么转移过程分为两步
- 若前 \(a\) 个和后 \(b\) 个间没有联系,则
- 若第 \(a\) 个棋子和第 \(a+1\) 个棋子被选为一组,则
这启发我们将 \(f_{i,0},f_{i,1},\cdots,f_{i,k}\) 看作一个多项式 \(g_i\) 的各项系数,则上述转移过程将类似于 NTT 。那么只要维护 \(g_t,g_{t-1},g_{t-2}\),就可以递推出 \(g_{2t},g_{2t-1},g_{2t-2}\),从而倍增得到答案。值得一提的是,评论中有一种利用多项式开方的方法,可以借鉴。
时空复杂度:\(O(klognlogk) - O(klogk)\)
关键字:动态规划,倍增,NTT