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的因子进行容斥

Megumin的代码

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][jigwedge(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逆推其他状态。

I 60 / 445 字典树

J dp

J 1 / 51

SWJTU_LightMoon Training #10

A 1 / 15 矩阵树+高斯消元

C 1 / 24

D 线段树+离散化 先用差分处理出水平方向和竖直方向上所有长度为W和H区间内士兵的个数,遍历y用线段树维护x方向的最大值,离散化的时没用数组写的vetcor,每次清空要花时间,会导致TLE

WQF代码

E 0 / 12

G 4 / 37

H 0 / 32

K 8 / 67 树分治

L 8 / 181

原文地址:https://www.cnblogs.com/ACGO/p/7444089.html