Loading

22.1 杂题

1.15

KEYENCE Programming Contest 2021

A - Two Sequences 2

简单模拟,记一个 a 的前缀 max 即可。

code

B - Mex Boxes

简单贪心。挨个填就好了。

code

F - Keyence Repetition

\(f_i\) 是第 \(i\) 个字符再哪个循环里。显然 \(f_i\le f_{i+1}\),那么我们只需要确定有几个严格 \(<\) 即可,其他都取等。这样方案数就是 \(\binom{n}{m}\),其中 \(m\) 是不同的数的个数。那么这个显然可以 \(dp[l][r][state_l][state_r]\) 代表 \([l,r]\) 这一段,左边在循环中的状态是 state_l,右边是 state_r 的多项式。这样直接分治复杂度 \(O(27nlog^2n)\) 勉强能冲。

然后发现除了 e 的部分都不需要那个 27 的常数,而 e 的部分又可以倍增,于是常数就下来了。然后又发现倍增可以和枚举状态分开了,于是就 \(O(kn+n\log n)\) 了。

code(当然是前者,后者狗都不写)。

1.16

青鱼杂题选讲。

Div. C

Count the graphs\(^{4}\)

给定 \(n,k,mod\) 求有多少个 \(n\) 个点的简单无向图, 使得 \(1\) 号点和 \(2\) 点联通且 \(1 \to 2\) 的最短路长度为 \(k\).

\(2\le n\le 100,1\le k<n,1\le mod\le 10^9.\)

图计数不好搞考虑对最短路树计数。设 \(f[i,j,s]\) 代表 \(i\) 个点有 \(j\) 层且第 \(j\) 层有 \(s\) 个点,转移就枚举第 \(j+1\) 层有 \(t\) 个点即可。然后分配标号时根据 \(j\) 分类讨论。转移的系数大概是 \(2^{\binom{t}{2}}(2^s-1)^t\binom{n-i-u}{t-v}\)\(u,v\) 是根据 \(j\) 分类讨论出的数。

code

Knight\(^{5}\)

QQ截图20220116212822.png

可以把棋盘建成一个二分图。如果 A 一步否动不了则 B 胜,否则加入他们不在同一个连通块中则 A 可以来回走,B 每次只能选择新的点。否则如果两人在二分图的同侧 A 胜,否则 B 胜。因为此时 B 走的时候一定与 A 不同侧,所以不可能堵住 A,A 还是可以来回走。

code

Territories\(^{6}\)

平面上有一个 \(X \times Y\) 的矩形和 \(n\) 个点。你要把每个点放在矩形内部的一个整点上。
每个点有一个限制 \(x_1, y_1, x_2, y_2\), 表示这个点不能放在以 \((x_1,y_1)\)\((x_2,y_2)\) 为左下和右上端点的矩形内部。
如果一个整点上放了 \(p\) 个点, 那么它的收益是 \(p(p−1)/2\)
输出最大的可能收益。

\(1\le n\le 10^5,1\le X,Y\le 10^3.\)

根据贪心,整个矩形内最多的一定是极大的。剩下的点一定可以放在至多两个角上。也就是说我们至多用三个点。具体实现我们可以用二维前缀和预处理每个位置有多少不能放,以及不能放的可以放到每个角上有多少个。复杂度 \(O(n+XY)\)

code

Od deski do deski\(^8\)

对于一个长度为 \(n\) 的序列 \(A_1,A_2,\dots, A_n\) 每次你可以选择两个值相同但位置不同的元素 \(A_i,A_j\),然后将 \(A_i,A_{i+1},\dots, A_j\) 删除.

如果一个序列可以通过上述操作删为空序列,那么就称这个序列是好的。

问有多少长度为 \(n\) 且元素在 \([1,m]\) 内的好的序列.

\(1\le n\le 3000,1\le m\le 10^9.\)

如果有包含关系的那么肯定删那个更大的,于是删除的区间不会有交。

考虑一个序列 \(S\),如果 \(S+x\) 是 合法的,那么 \(S+x+x\) 也必然是合法的。于是可以考虑 dp,设 \(f_{i,j,1/0}\) 代表长度为 \(i\) 的序列,在后面放 \(j\) 种数可以变成合法的,当前是否合法。答案显然为 \(\sum f_{n,i,1}\)

考虑如何转移,如果当前合法,那么继续填那 \(j\) 种显然会继续合法,并且合法数量不会增多。于是 \(f_{i,j,1}\times j\to f_{i+1,j,1}\)。如果填剩下的 \(m-j\) 种数中的某个,显然不合法了且会多出来一种你填的这个可以消掉变成合法的,于是 \(f_{i,j,1}\times (m-j)\to f_{i+1,j+1,0}\)。如果当前不合法,显然还是可以转移到合法 \(f_{i,j,0}\times j\to f_{i+1,j,1}\)。然后考虑第二种转移,和前面唯一的区别是,你如果再选一遍你当前选的,你还是寄。也就是你只能这么转移 \(f_{i,j,0}\times (m-j)\to f_{i+1,j,0}\)

code

Div. B

ロボット(robot)\(^{11}\)

容易发现边的颜色是可以随时到那里在改的,而且由于有 \(m\) 种颜色所以根本不需要担心重复。然后边就分成两种,一种这种颜色只有一条,直接 \(0\) 花费走过去。还有就是修改,又分成两种:

  • 花费 \(w\) 修改这条边的颜色

  • 花费 \(sum-w\) 修改其他与改点相连的同色边的权值

考虑分别对两种情况建边即可。但是容易发现如果存在 \(a\to b\to c\),颜色相同,且先用 \(1\) 再用 \(2\) 花费重复计算。我们考虑直接让 \(a\) 走到 \(c\) 花费 \(sum-w_c\),直接建边复杂度显然不对。那么搞一个虚点即可。

code

【模板】特征多项式\(^{13}\)

特征多项式的定义:\(P_A(z)=\det(zI-A)\)。如果这是一个上三角矩阵,那么我们显然可以把对角线乘起来得到特征多项式。否则我们可以通过 相似 变换来转变为一个上海森堡矩阵求特征多项式。

ps:显然存在高复杂度的插值做法但我们不予讨论。

\(P\) 是可逆矩阵,则称 \(B=PAP^{-1}\)\(A\) 相似,且 \(P_A(z)=P_B(z)\)。这个手推一下就可以证明。然后我们可以使用高斯消元进行相似变换。与初等行列变换不同,相似变换需要考虑 \(P^{-1}\)。经过手玩或打表,可以推得如下规律:

  • 交换 \(i,j\) 行时需交换 \(i,j\) 列。

  • \(i\) 行乘上 \(k\) 加到 \(j\) 行时需将 \(j\) 列乘上 \(k\) 减到 \(i\) 列。

  • \(i\) 行同成 \(k\),第 \(i\) 列同除 \(k\)

然后我们想要消成上三角矩阵却发现不允许,只能消成上海森堡矩阵。不懂可以 google。然后这玩意可以 \(O(n^2)\) 求行列式。考虑行列式某个定义,消去一行一列。记 \(F_i(z)\) 是前 \(i\) 行列的特征多项式,归纳得到递推式 \(F_i(z)=zF_{i-1}-\sum_{j=0}^{i-1}A_{i-j,i}(\prod_{k=0}^{j-1}A_{i-k,i-k-1})F_{i-k-1}(z)\)

code

题目来源

4 Moscow Workshops Juniors 2022 - Qualification Round 1[QOJ2158]

5 Petrozavodsk Summer 2018. Day 8. Yuhao Du Contest 5(XIX Open Cup, Grand Prix of Zhejiang)[QOJ 2213]

6 Petrozavodsk Summer 2020. Day 1. Warsaw U Contest(PotyczkiAlgorytmiczne 2019 Final)(QOJ 1243)

8 Potyczki Algorytmiczne 2021, Runda 1(QOJ 2115)

11 第 20 回日本情報オリンピック (JOI 2020/2021) 本選 https://atcoder.jp/contests/joi2021ho/tasks/joi2021ho_d

13 https://www.luogu.com.cn/problem/P7776

1.25

ARC133

A - Erase by Value

先判掉一些全相等的平凡情况。然后考虑一个性质,如果不选第一个数或第一个与第一个数不同的数,那么选啥都一样。于是我们比较这两个数,如果后者小那么把第一个数选了即可。否则我们考虑递归到子问题,也就是把前一段全部一样的数删掉然后继续做。怎么证明?直觉。。。其实只用到一个性质 \(a<b,b<c\Rightarrow a<c\)。复杂度 \(O(n)\)

B - Dividing Subsequence

如果从新定义 \(=\) 为约数即可,可以转换为 LCS,又知排列的 LCS 可以转成 LIS,于是就做完了。复杂度 \(O(n\log^2n)\)

C - Row Column Sums

可以证明如果有解则前 \(n-1\)\(m-1\) 列瞎填都可行。所以不妨把这些位置全部填 \(k-1\)。然后对于边界的情况补成 \(k-1\) 即可,贪心证明这样不会更劣。

F - Random Transition

加强对二元 GF 的理解。首先是概率统计里很套路的一步转换,把一个数 \(x\) 想象成一恰有 \(x\)\(1\) 的长度为 \(n\)\(01\) 串。于是操作相当于等概率选择一个位置反转。想出这一步估计就够神仙了。既然如此我们只需考虑再经过了 \(K\) 轮后有几个 \(1\) 即可。注意我们并不关心一开始每个 \(1\) 在什么位置。

实际上我们想要知道从 \(a\)\(1\) 变成 \(b\)\(1\) 的方案数。这里需要考虑每个位置有多少轮是翻了那里,原先就是 \(1\) 的位置翻偶数次是 \(1\),原先是 \(0\) 的位置翻奇数次是 \(1\),所以我们要求即为 \(k![x^Ky^b](y\cdot \frac{e^x+e^{-x}}{2}+\frac{e^x-e^{-x}}{2})^a(y\cdot \frac{e^x-e^{-x}}{2}+\frac{e^x+e^{-x}}{2})^{N-a}\)。设 \(P=(y+1)e^{x},Q=(y-1)e^{-x}\)。那么原来的生成函数可以写成 \(\frac{1}{2^N}(P+Q)^a(P-Q)^{N-a}\),不管尝试,考虑求后面的部分。考虑所有的 \(a\),列出最终的生成函数 \(\sum\limits_{a=0}^{N}A_a(P+Q)^a(P-Q)^{N-a}\)。把后面两项二项式定理展开,化一化可以转换成 \(\sum\limits_{i=0}^{N}w_iP^iQ^{N-i}\)。而 \(w_i\) 通过计算发现等于 \([z^i]\sum\limits_{i=0}^{N}A_i(z+1)^i(z-1)^{N-i}\)。而答案的生成函数也可以表示成 \(K!\sum\limits_{i=0}^{N}w_i(2i-N)^{K}(y+1)^{i}(y-1)^{N-i}\)。于是我们要解决的问题变成了:

给定一个序列 \(C\),求 \(\sum\limits_{i=0}^{N}C_i(z+1)^i(z-1)^{N-i}\)

这个问题显然可以分治NTT在 \(O(n\log^2n)\) 的时间解决,但其实可以通过换元(或者复合)在 \(O(n\log n)\) 的时间解决。

考虑求出 \(G(z)=\sum\limits_{i=0}^{N}C_iz^i(z-2)^{N-i}\)。这东西你把后面二项式定理展开一下就可以卷了。然后代入 \(z+1\) 就可以得到原式,即 \(\sum\limits_{i=0}^{N}g_i(z+1)^{i}\)。这玩意也可以二项式展开然后卷。

posted @ 2022-01-15 19:36  Semsue  阅读(111)  评论(0编辑  收藏  举报
Title