The 2020 ICPC Asia Macau Regional Contest
链接
题解
A.Accelerator
对于一个长度为 $k$ 的数组,方案数是确定的,为 $k!(n-k)!$。问题转换成对于每个 $k$,从 $n$ 个数里选择 $k$ 个的乘积之和。
显然为 $[x^k]\prod_{i=1}^n(a_ix+1)$。
分治FFT即可。
15min从开始想到写完,速度还行。。
1 | const ll mod=998244353; |
B.Boring Problem
一个显然的做法是:建出AC自动机以后在上面dp,由于有后效性,需要使用高斯消元,时间复杂度 $O((nm)^3)$,没有办法通过。
考虑使用主元法。设 $dep_u$ 表示节点 $u$ 在Trie中的深度。设 $F(x)=0$ 为节点 $x$ 的一个方程。那么有:
$F(x)=1+\sum_{i=1}^kp_iF(ne_{x,i})$。
对于每个方程,可以发现,有些 $ne_{x,i}$ 的深度是大于 $x$ 的,此时 $ne_{x,i}$ 必为 $x$ 在原 Trie中的儿子。
考虑从上往下bfs,每遇到一个 $x$ 时,$ne_{x,i}$ 的深度小于等于 $x$ 的点的方程已经知道了。记 $ne_{x,i}$ 深度大于 $x$ 的个数为 $k$,我们新增 $k-1$ 个未知数,用这 $k-1$ 个未知数和 $F(x)$ 表示出剩下的那一个,这样就刚好有叶子结点个数+1个未知数和方程,就可以解出来了。
时间复杂度 $O(n^3+nm^2k)$。
C.Club Assignment
建出Trie,在Trie上dfs,看什么时候能取到答案。
设 $siz_i$ 表示节点 $i$ 的子树中有多少个数,$dep_i$ 表示$i$ 子树的高度。如果 $siz_{i}\geq 3$,则说明这里面当中一定有两个数在一个集合里,则说明答案至多为 $2^{dep-1}-1$。
于是,如果两个儿子的其中一个的 $siz\geq 3$,那么答案一定在子树内出现,而不用考虑当前子树。
剩下的就是两个子树的 $siz\le 2$,总个数不超过 $4$ 个,暴力枚举集合即可。
D.Artifacts
简单模拟。
E.Mountain
大毒瘤计算几何+DP。
或许是自己的实现太拉胯了。。。
对于 $[i,i+1]$ 部分,能覆盖这一段的只有在 $[i-w+1,i+w]$ 区间当中的点。
设 $f_{i,j,s}$ 表示考虑到前 $i$ 点,选了 $j$ 个,前 $2w$ 个点(包括自己)选择的情况为 $s$,只统计到 $[i-w,i-w+1]$ 段的最大值。
那么转移就是枚举上一种的情况,枚举第 $i$ 个点的选择情况,然后得到新的状态 $s_1$,统计出在 $s_1$ 状态下,$[i-w,i-w+1]$ 有多少被覆盖到,设为 $g_{i-w,s_1}$,然后转移就比较简单了。
很容易出错的是这个 $g_{i,j}$ 的计算。训练时没有考虑到覆盖部分并不是一个连续的段,而有可能会分成若干段。那么对于每个选择的点,会有一个覆盖区间,将这些区间的左右端点排序后,扫描线维护一下这个括号序列,然后对于一段覆盖的 $[l,r]$,用基础计算几何知识算出覆盖的面积即可。
时间复杂度 $O(n\times(n+w\log w)\times 2^{2w})$。
1 |
|
F.Fixing Networks
构造题。
除去特殊情况后,剩下的每次用 $d+1$ 个点形成的完全图去用掉一个颜色。最后剩下 $m=n-(d+1)(c-1)$ 个点,需要每个点的度数为 $d$,且图连通。
那么对于 $d$ 为偶数的情况,每个点 $i$ 向 $(i+j)\bmod m(j\le \frac{d}{2})$ 连边。
$d$ 为奇数也同理,每个点多连一条边即可。
G.Game on Sequence
设 $f_i$ 表示从 $i$ 开始是否必胜。
那么对于所有的 $j$ 满足题意,只要有一个 $f_j=0$,那么 $f_i=1$,否则 $f_i=0$。
对于一个 $i,j$,满足 $i<j$ 且 $a_i=a_j$,那么 $f_i$ 必定为 $1$:
若 $f_j=0$,显然 $f_i=1$。
若 $f_j=1$,那么存在一个 $k$,使得 $j$ 能到 $k$ 且 $f_k=0$,那么这个 $i$ 也能到 $k$,因此 $f_i=1$。
于是设 $las_i$ 表示 $a_j=i$ 的最大的下标 $j$,若 $i\neq las_{a_i}$,那么 $f_i=1$,
否则暴力枚举剩下的情况。
时间复杂度 $O(na\log a)$。
H.Fly Me To The Moon
留坑…
I.Nim Cheater
设 $f_{u,i}$ 表示点 $u$ 的路径中,异或和为 $i$ 的最大值。
方程为 $f_{u,i}=f_{fa_u,i\bigoplus a_u}+val_u$。
为了使空间比较小,可以用如下性质:
重链剖分后,每个点到根节点的路径中,遇到到轻链的个数不超过 $\log_2 n$。
于是,设 $f’_{dep,i}$ 表示当前点到树上路径中,遇到轻链个数为 $dep$ 时的DP值。
类似于树上启发式合并,我们先走轻链,走完后全部清空。然后走重链,走重链时 $dep$ 不更新。
这样就能保证空间复杂度为 $O(n+a\log n)$ 了。
J.Jewel Grab
设 $pre_x$ 表示 $x$ 前第一个颜色相同的下标。
那也就是找到最大的 $r$,使得 $\sum_{i=l}^r [pre_i\geq l]\le k$。
由于 $k\le 10$ 的限制,考虑每次暴力找到最大的下标 $r$ 满足大于等于当前的下标 $now$ 且 $[now,r]$ 间的 $pre$ 均小于 $l$。
线段树二分找到这个 $r$。
然后还需动态维护 $pre$ 数组,以及需要对每个颜色维护最大值,以确定需要跳过哪些数。
时间复杂度 $O(nk\log n)$。
代码巨长。。
1 |
|
K.Candy Ads
大毒瘤题。
2-SAT模型,关键是如何建图。
用bitset存下哪两个广告间有可能重复。
用Kosaraju算法跑出SCC,关键是如何快速跳过已选过的点。
再开两个bitset,存下 $2n$ 个点中哪些点已经遍历过了。
超级无敌卡空间,只能开得下 $50000\times 50000$ 的bitset。
过于毒瘤,并不想写代码。。。
L.Random Permutation
简单数学题,答案为 $\frac{(n!)^2}{n^n}$。