Codeforces8月解题报告
不定期更新
EDU Round 133
A, B水题
C. Robot in a Hallway
题意
从起点(1,1),在2×n的棋盘上行走,不重、不漏地走过所有格子。每个格子上有一个数ai,j,满足在ai,j时刻之后才能走向那个格子。求走完所有格子的最小时间。
分析
由于是2×n的棋盘,并且满足不重不漏,那么前面一段必定是类似蛇形的走法,后面半段则是走到最右之后返回。
那么前面半段采用搜索的方法,枚举蛇形的终止位置,记录走完蛇形的最小时间。然后后面半段可以用类似前缀和的方法。
假设我从(1,1)就直接往右走,那么走完第一行的最短时间就是max(a1,i−i)+n−1,其中max(a1,i−i+2)是等待时间,n−1为步行时间。这里只是特殊情况,一般情况还需推导。
这题主要就是要推式子,没啥思考
D. Chip Move
题意
给定n,k,从0出发,第i步可以走(k+i−1)的倍数(正数)的距离,求走到x∈[1,n]的方案数,对每个x都分别求。
分析
挺水的一道题。
最朴素的做法:状态f[i][j]走i步,到达j的方案数。转移枚举第i走的距离,有f[i][j]=∑l∣k+i−1f[i−1][j−l]。
然后发现距离的转移可以优化:f[i][j]=f[i−1][j−(k+i−1)]+f[i][j−(k+i−1],这样复杂度就是O(n2)了。
又因为每一步走的最少距离是递增的,所以最多走n步,所以层数为n,总共的时间就是O(nn)。空间滚动数组优化到O(n)。
E. Swap and Maximum Block
发现操作和与异或有相同的性质,可以将[1,2n]区间像线段树那样划分,每个区间节点维护所有可能的操作状态,长度为2i的区间节点只需要维护2i种不同的操作状态,剩下n−i位只对上层产生影响。因此每层节点的状态数是2n,总共n层,时间和空间复杂度是O(n2n)。
节点维护的信息:最大字段和、与左端点相邻的最大字段和、与右端点相邻的最大字段和。跟线段树一样去合并信息就好了。
F. Bags with Balls
题意
n个盒子,每个盒子中有m个有标号的小球(不同盒子中相同标号的小球认为是不同的),标号∈[1,m]。从每个盒子中随机取出一个小球,令F标号是奇数的小球个数。求所有取球方案的Fk的和。
分析
首先令x,y表示盒子中标号为奇数和偶数的小球个数:x=2m+1,y=2m。得到奇数标号的小球数量为c的方案数f(c)=Cnc×xc×yn−c。ans=∑i=1nik×Cni×xi×yn−i
但是n≤998244352,显然是不能通过的。O(Tk)才是能通过的复杂度。
考虑ik的意义,等价于将k个小球放入i个盒子(不同、可空)的方案数。若枚举考虑非空盒子的数量j,ik=∑j=1iCij×S(k,j)×j!。Cij表示取j个盒子的方案,S(i,j)为第二类斯特林数,将k个小球放入j个非空盒子(相同)的方案数,j!是盒子的排列。
代入到原式子
ans=i=1∑nik×Cni×xi×yn−i=i=1∑nCni×xi×yn−ij=1∑iCij×S(k,j)×j!(改变求和顺序)=j=1∑nS(k,j)×j!i=j∑nCij×Cni×xi×jn−i=j=1∑nS(k,j)×j!i=j∑nCnj×Cn−ji−j×xi×jn−i=j=1∑nS(k,j)×j!×Cnji=j∑nCn−ji−j×xi×jn−i(二项式定理)=j=1∑nS(k,j)×j!×Cnj×xj×(x+y)n−j
斯特林数和组合数可以预处理,复杂度为O(Tk+k2)
Codeforces Round 812
A,B,C水题
D. Tournament Countdown
题意
交互题,2n个人进行锦标赛制。ai表示第i个人的胜利次数。每次询问i,j,如果ai<aj返回 1
,如果ai>aj返回 2
,如果ai=aj返回 0
。使用不超过312n+1次询问找到冠军。
分析
如果每4个人使用2个询问,则使用的次数为$2^{n-1} + 2^{n-3} + … =\leq \frac{1}{3}2^{n+1} $。
在相同组的4个人中,ai是类似{0,1,0,2}分布的,两人的小组必有ai=0和aj!=0。
查询1,4
- 返回
0
,表示1,4的ai=0,都不是胜者,再在2,3当中查
- 返回
1
,表示a1=0,a4=0,胜者在1,3当中
- 返回
2
,表示a1=0,a4=0,胜者在2,4当中
每一组的四个人都是这样的。递归解决,每一层规模÷4。
E. Cross Swapping
题意
对一个n×n的矩阵进行若干次操作,可将矩阵的第k行和第k列交换。最后使得矩阵的字典序最小(从第一行读到第n行)
分析
从前往后逐个扫描,假设当前是第i行第j列的元素a[i][j],和a[j][i]进行比较,如果要使它交换,则i和j只能被选其中一个;如果不交换,则i和j可以被选两个或都不选。
这样就变成了i和j的相对关系,用带权并查集或者扩展域并查集来维护。
F. Lost Array
to be updated
SOS Dp
SOS Dp 逆运算