这场题是可以,就是数据范围有点微妙,不知道出题人是不怕卡常还是太相信现场判题机。
以后集训队内都过掉的签到就不写题解了,只写一些有价值的题目。
C. Pyramid
dp。考虑每个位置为$L$当且仅当这个位置被经过偶数次,所以可以通过求出每一层中所有位置被走过的人数来判断每个位置的朝向,同时记录第$k$个球的位置以确定答案。
假设当前点走过了$x$人,则有$\lceil\frac{x}{2}\rceil$人往左,$\lfloor\frac{x}{2}\rfloor$人往右,用$f_{i,j}$记录第$i$层第$j$个位置有多少人走过,然后$O(1)$转移到下一层。
(总复杂度算了算是$O(1e9)$左右,赛中感觉$3s$能过就莽了,没想到就跑了不到$2s$)
E. A Color Game
区间dp。一看范围$n,m\le500$,$7$种颜色的区间消除操作,盲猜一波$O(7n^3)$的区间dp。
从时间复杂度上自然想到状态可能是$f_{l,r,k}$表示$l,r$内第$k$种颜色的xxx值。由于区间消除的性质,考虑如果$[l,r]$可以消除,那么的前一个状态先消到只剩一种颜色,且这种颜色数量不小于$m$。所以其实$f_{i,j,k}$表示的就是区间$[l,r]$中如果只剩$k$,最大能剩多少个(如果不剩就用$-1$表示)。
有一点需要注意,当$f_{l,r,k}\ge m$时,要把其他颜色的$f_{l,r,k’}$设为$max(f_{i,j,k’},0)$,以防止两个不同色可消区间合并出现问题。
最终复杂度为$O(7n^3)$。
F. Cable Protection
贪心 dp。血的教训2:能dp就不要贪心
题意就是求基环数上半径为1的最小点覆盖,首先考虑环上的每一棵子树做一遍树形dp,$f_{i,0/1}$表示$i$点选或不选的最小代价,然后考虑环上的点也是两个状态,用类似的方法dp即可。
(这场怎么这么多dp)
G. Graph Cards
树哈希,最小表示法。
【前置芝士:就是上面两个东西】
看到题自然能想到要用哈希之类的方法记录环上子树的状态,然后再对环再进行哈希(此时环上每个点代表子树的哈希值),
对于树,我们有以下两种较好的方法进行树哈希:
- $f_u=1+\sum_{son(u,v)}f_v\times p_{s_v}$
- $f_u=\prod_{son(u,v)}(f_v+p_{s_v})$
其中$s_u$表示$u$的子树大小,$p_i$表示第$i$个素数。
如果要判断环同构的话,就是最小表示法裸题了,详见oi-wiki。
题外话:我超,出题人未免太能卡了,同时用了两种树哈希+环上双哈希+瞎搞(反转$1$到$1e6$的素数)wa了10发才过,$1e6$的在各种哈希和处理下跑了快$3s$。。。
I. Critical Structures
tarjan。赛中队友过了,待补,听说是题意不清的tarjan板子题。
K. Number with Bachelors
组合。对于所有询问,十进制十六进制处理起来没啥区别,而当你可以求出第$k$大合法数字时,同样可以二分求出$[l,r]$区间内的合法数字个数,反之亦然,所以等价于只有一种询问(求第$k$大合法数字)。
就十进制来说,显然长度为$x$的数有$9\times{9\choose x-1}\times(x-1)!$种选择方法,因此可以确定第$k$大合法数字的长度$L$,然后就参考这个方法,每次确定一位直到$L$。
C++读入和输出$16$进制的一个小trick:
1 | cin>>hex>>n; |
(赛中差一点写完,思路是从求区间个数二分出第$k$大,实际上反过来会容易一些,最后还是不够冷静啊)