SWJTU_LightMoon Training #6~10 补题
SWJTU_LightMoon Training #6
A NTT+CDQ分治 有环的连通图数量=连通图数量-树的数量,而完全图的生成树个数等于\(n^{n-2}\),那么我们只需要求出n个点连通图的数量即可。而连通图数量=总的图的数量-非连通图的数量。我们可以枚举包含某个点的连通图大小去计算非连通图的数量。可以发现,表达式是一个卷积的形式,用cdq分治+NTT计算即可。
[Megumin的代码] (代码什么的,当然是不存在的呀)
B 0 / 5 表达式求值
C 1 / 1 高斯消元
D 状压DP
- 这道题其实是求有多少种1~n的排列,使得每个数都在范围内且包含的“坏模”不超过10个。
- 我们把“坏模”的数挑出来,剩下的数任意组成排列就组成一个方案了,所以关键是数“坏模”能组成的数的组合。令f[i][s]表示到第i个青蛙,这只青蛙用的“坏模”的情况(或者已经被用掉的),这时的数目。由于每只青蛙能到达的“坏模”不一定一样,所以s是离散的,转移的时候要处理出下一个状态的s’。最终的结果在f[n][(1<<sz)-1]里,其中sz为最后一只青蛙井里的“坏模”个数。最后一只青蛙一定是把所有“坏模”都“用”了,否则不是排列,结果为0。
F 9 / 72 乱搞+字符串
G 后缀数组
- 求出后缀数组后,对于每个i,向两边扩展扫描,找到最大的匹配长度和匹配点。一个优化是,根据lcp的特性,如果扫描到有下降时可以断掉扫描。(当然,这得找出第一个匹配点之后)事实证明,这样跑得很快(= = |||)。
I 树状数组 考虑离线操作,构造两个树状数组, 第一个树状数组以y-x为关键字,以x为时间序插入修改, 第二个树状数组以y-x为关键字,以x+y为时间序插入修改,为了防止边上的计数问题,可以将坐标都乘以2,挺难搞的一道题
J 0 / 2
SWJTU_LightMoon Training #7
A 0 / 1
C 0 / 1
E 2 / 4 轮廓线DP
F 首先我们很容易得到每只青蛙所跳到的位置是\(gcd(a_i,m)\)的倍数,但是很显然单独计算每只青蛙所跳过的位置的下标和会有很多重复。而观察到\(gcd(a_i,m)\)是m的因子,那么我们可以考虑对m的因子进行容斥
H 1 / 25
I 25 / 113 二维树状数组
J 0 / 7
K 这题有两种做法:NTT+CRT|FFT模任意素数 以及DP+容斥
- dp+容斥
- 首先,该问题求解的是不含前导零的排列数,我们设\(w(n,a_0,a_1,a_2,a_3,a_4)\)表示总共\(n\)个数字,\(i\)的数目不超过\(a_i\)的任意排列数,那么结果为\(w(n,a_0,a_1,a_2,a_3,a_4)-w(n-1,a_0-1,a_1,a_2,a_3,a_4)\),相当于减去必含前导零的排列数。
- 然后我们考虑计算\(w(n,a_0,a_1,a_2,a_3,a_4)\),我们可以进行容斥,结果等于随便排-有一个必超过上限,另外随便排+有两个必超过上限,另外随便排-...
- 然后计算必然超过上限时,只需要添加\(a_k+1\)个数即可
- 我们用\(dp[i][j][t]\)表示枚举到第\(i\)个数,\(j\)表示每个数是否超过,\(t\)表示超过上限的数的个数的排列数,那么状态转移分两部分\(add(dp[i][j],dp[i-1][j]*(5-t+|j|))\)这是随意填数的转移\(|j|\)表示超过上限的数的个数;\(add(dp[i][j],dp[i-a_k-1][j\bigwedge(1<<k)]*C^{a_k}_{i-1})\)这是使第\(k\)个数超过其上限的转移
- 需要注意上面转移的组合数,很显然这是在\(i-a_k-1\)长度的排列中插入\(a_k+1\)个相同数的排列数,\(i-a_k-1\)有\(i-a_k\)个空位,但是最后一个空位是必须插入数的,因为不插入数的部分的计算已包含在第一个转移里,因此相当于在\(i-a_k\)的空位中插入\(a_k+1\)个相同数,且最后一个空位必须插入数的种数等价于\(C^{a_k+1}_{i}-C^{a_k+1}_{i-1}\),由组合恒等式可得结果为\(C^{a_k}_{i-1}\)
Megumin的代码
L 费用流
注意相邻的空格需要来回走构成环,所以先拆点,然后建图
- S到奇数入点建边,流量为1费用为0
- 偶数出点到T建边,流量为1费用为0
- S到空点入点建边,空点出点到T建边,流量为1费用为0
- 每一个点的入点到上下左右的点的出点建边,流量为1费用为连边费用
跑费用流判断是否满流,为什么一定是判断满流呢,考虑最大流,必然是
1.奇数到偶数的路径上相邻的点u,v,左u提供新的流量给右v输出
2.环上相邻的互相流
WQF代码
SWJTU_LightMoon Training #8
C 1 / 14 SET
D 27 / 170 并查集+左偏树
E 10 / 49 dp
G 5 / 125 博弈+讨论
H 0 / 4
I 4 / 57 计算几何
J 1 / 51
SWJTU_LightMoon Training #9
B 1 / 23
C 最大密度子图 首先根据01分数规划,先二分答案,然后就是建图,后面就转化成最大密度子图,之前一直以为是个很冷门的模型,看来还是碰到了就要学一下。
D 0 / 5
E 2 / 34 计算几何
G 9 / 115 回文树
- 用两个串构建两个回文树。记录每个回文串的出现次数。
- dfs这两棵树,当节点都存在时加上他们出现次数的乘积。
H 博弈+dp
- 查了一下这种题,发现是套路(= = |||)。
- 环上的情况比较难考虑,索性把所有状态一开始都设为Bob赢,专心考虑Bob输的情况。初始化:B(ob)和A(lice)相遇无论如何B输,B无路可走则也输。
- 假设有个状态A走一步后到B输的状态,则该状态B输;假设有个状态B无论怎么走都到B输的状态,则该状态B输。
- 用一个队列存储初始B输的状态,从初始状态bfs逆推其他状态。