ATC 做题随记
AGC066C
观察到一段字符串可以被消去的条件是:
可以被划分为满足以下条件的若干子串:
- 长度为三的倍数
- 开头结尾至少有一个 B。
线性 dp 即可。
ARC182C
\(m\) 很小,有用的质因数就更小了,只有 \(6\) 个,记录 \(X\) 为 \(\prod p_i^{a_i}\),即要维护 \(\prod (a_i+1)\),每次在多点加。
用状压思想,维护所有\((a_i+1)\) 是否乘进去的乘积即可,每次通过这些计算贡献。因为 \(n\) 很大,要矩阵加速。
ABC368E
时间从前往后考虑每一个,维护每个点最晚火车到站的时间,就可以计算答案了。
PS:记录这题主要是不冷静下来可能会想错或想不出来。你怎么知道当时被这题搞崩心态了
ABC371G
相当于 \(i\) 向 \(p_i\) 连一条边。每个点向其出边走。
从前往后贪心地考虑当前位的最小值,前面的一些位一定会形成一些同余方程的限制,从小到大枚举当前的环上的数是否满足前面的限制。这样是 \(O(nd(n))\) 的。维护所有模数为 \(p^k\) 的形式的限制,即可做到 \(O(n\log n)\)。(好像并不重要。)
ABC373G
每个两个点之间边的边权为它们的距离,最小权匹配就是合法方案,因为交叉会使权变大。可能要使用一些比较优秀的费用流板子(我的 EK 过不了……)。
ARC185D
ABC376G
考虑对于 \(a_i\) 最大的那个连通块,要是到了 \(fa_i\) 就一定会往这里跑,这给我们启发将 \(i\) 和 \(fa_i\) 合并起来。
考虑两个连通块 \(x,y\) 谁的优先级更高:记 \(ans_i,sz_i,p_i\) 为 \(i\) 连通块的期望走的次数、大小、概率之和。
先 \(x\) 后 \(y\) 的答案为 \(ans_x+sz_xp_y+ans_y\)(若宝藏在 \(y\) 的连通块内会多走 \(sz_x\) 步)。同理先 \(y\) 后 \(x\) 的答案为 \(ans_y+sz_yp_x+ans_x\),整理可得 \(\frac{sz_x}{p_x}<\frac{sz_y}{p_y}\) 是 \(x\) 的优先级更高。用优先队列维护最大优先级的点,每次合并即可。
AGC040C
将奇数位的 A 替换为 B,B 替换为 A,这让原题的一个串和一个串的双射关系,我们可以在变化后的串计数,即不能删除 AA 和 BB。设 A,B,C 的个数分别为 \(a,b,c\),最优策略显然是尽量先匹配 AB,然后再用 C 匹配,至少要满足 \(|a-b|\leq c\),容易发现这个策略一定可行,所以要满足 \(2a\leq n\) 且 \(2b\leq n\)。容斥掉 \(2a>n\) 和 \(2b>n\) 的情况,这两种情况显然不能同时成立。答案为 \(3^n-2\sum\limits_{i=n/2+1}^n\binom{n}{i}2^{n-i}\)。
ABC379G
ARC171E
考虑转换移动过程,黑石子肯定是横纵交替移动的。纵向移动就将黑石子和所用的白石子所在行染色,横向移动就将黑石子和所用的白石子所在列染色,很显然每次不能染已经染色的行和列,当且仅当最后 \(2\) 次移动会和初始的行列重合。可以证明一种合法的摆放方式只有一种移动方式且染色过程和移动方式一一对应,对染色过程计数即可。
不妨钦定最后 \(2\) 次的方向是先向上再向左,其他情况就翻转 \((a,b)\) 就行了。分别计算行和列。对于行,除了特殊的最后一次染色,共有 \(m=\frac{M}{2}-1\) 次染色,枚举初始行下面染了几次,确定染色的位置和顺序,最后一次染色必须在下方的已经染色的行中选,可以推出 \(\sum\limits_{i=1}^mi\binom{n-a-1-i}{i}\binom{a-1-(m-i)}{m-i}(m-1)!\),列同理。
ARC173D
可以发现 ( 和 ) 数量相同的序列可以通过循环移位来得到合法括号序列。将 ( 和 ) 的权值设为 \(1\) 和 \(-1\),原题转化为在图上找权值和为 \(0\) 的经过所有边的回路。同时有正环和负环显然可以通过调整构造出来;都没有正环和负环,因为图是强连通的,则必然有环,只能是零环;只有正环和负环中的一种,不妨设只有正环,若有权值和为 \(0\) 的回路,则减去回路的正环必然可以得到出负环,矛盾,所以图中不存在零环。用 SPFA 判正环和负环即可。
ARC174E
枚举好序列前 \(i-1\) 位和 \(P\) 相同,\(a_{1\dots i-1}\) 的数的方案是很好求的,对于不出现的数 \(x\),若 \(x<a_i\),它可以在第 \(i\) 位和 第 \(i+1\dots n\) 位上;若 \(x\geq a_i\),它只能在 \(i+1\dots n\) 位上且第 \(i\) 位上的数要 \(<a_i\)。两种情况都分别贡献到一个区间,树状数组维护差分数组即可。注意后面的数只能在前面没出现过的数中选,这也要用一个树状数组维护没出现过的数。
ARC178D
考虑怎么删掉 \(x\),那么 \([1,x-1]\) 显然一定要在剩下的序列里面,而且都在 \(x\) 的左侧或右侧。可以发现我们关心的东西始终是在一个区间中,考虑区间 dp 。从小到大枚举 \(x\),将删除改为插入,记第 \(i\) 个空隙为 \((i,i+1)\)。记 \(f_{x,l,r}\) 表示 \([1,x]\) 在第 \([l,r]\) 个空隙的方案数。转移考虑 \(x\) 是否在 \(B\) 中出现过,出现过的话则 \([l,r]\) 必须包含 \(pos_x\),则 \(f_{x,\min(l,pos_x-1),\max(r,pos_x)}\gets f_{x-1,l,r}\);若不存在,则 \(f_{x,l,r}=\sum\limits_{i=l}^rf_{x,i,r}+\sum\limits_{i=l}^rf_{x,l,i}\)。前缀和优化就好了。
ABC378G
扬表题。回顾一下标准扬表的性质(不带证明):标准扬表是由 RSK 插入法构造的,每次插入一个数 \(k\) 的时候找到当前行(初始为第 \(1\) 行)第一个大于它的数 \(k'\),交换这两个数,用 \(k'\) 对下一行进行如上操作,直到找不到 \(k'\) 的时候插到后面并结束。这第一行的长度是 LIS 的长度,第一列的长度为 LDS 的长度。一对扬表(有序数对)和一个排列构成双射关系。记 \((h(i,j))\) 表示 \((i,j)\) 这个格子正下方,正右方及自己的格子个数,那么对于一种扬表的形状,它的填数方案为 \(\frac{n!}{\prod h(i,j)}\)
对于本题的好的排列,它的扬表一定是一个 \(B\times A\) 的网格去掉右下角,而且插入 \(n+0.5\) 会刚好插到 \((B,A)\) 上。也就是说 \(\forall i\in [1,B),a_{i+1,A-1}<a_{i,A}\)(每一行的 \(a_{i,A}\) 都要放到 \(a_{i+1,A-1}\) 上)。于是记状态为 \(f_{a_1,a_2\dots a_B}\),从模拟插入的过程,要满足当 \(a_i=A\) 时 \(a_{i-1}=A-1\) 和 \(a_i\leq a_{i+1}\) 即可。
ABC386G
直接求最小生成树的权值不好求,考虑转化成贡献。对于一个图,记 \(t_i\) 为加入 \(\leq i\) 的边后连通块的数量,那么其最小生成树的权值是 \(\sum\limits_{i=0}^m(t_i-1)\)。记 \(p_{i,j}\) 为加入权值 \(\leq i\) 的边图中形成 \(j\) 个连通块的方案数,答案就是 \(\sum\limits_{i=0}^m\sum\limits_{j=1}^n(j-1)p_{i,j}\)。枚举 \(i\),计算 \(p_{i,j}\),记 \(f_j\) 为 \(i\) 个点形成连通块的个数之和,\(g_j\) 为形成 \(i\) 个点的连通块的方案数。枚举最后一个点的连通块大小,可得:\(f_j=m^{\frac{j(j-1)}{2}}+\sum\limits_{k=1}^j\binom{j-1}{k-1}g_kf_{j-k}(m-i)^{k(j-k)}\),\(g\) 就容斥调不合法的情况就行了,得 \(g_j=m^{\frac{j(j-1)}{2}}-\sum\limits_{k=1}^{j-1}\binom{j-1}{k-1}g_k(m-i)^{k(j-k)}m^{\frac{(j-k)(j-k-1)}{2}}\)。
ARC174F
从朴素的 \(O(nV)\) dp 入手 \(f_{i,j}\) 表示第 \(i\) 轮剩 \(j\) 个石子的必胜状态,\(f_{i,j}\gets f_{i+1,j-k},k\in[l_i,r_i]\)。可以发现一段区间的答案是相等的。链表维护这些区间的左端点,初始是 \([0,l_i)\) 必败,\([l_i,+\infty)\) 平局。从后往前插入 \((l_i,r_i)\),每个答案必败区间 \([x,y]\),变成 \([x+l_i,y+r_i]\) 取并,然后每个区间答案取反。用 set 维护每个奇偶区间的长度,取反就在链表前面加个 \(0\) 即可,每次将区间长度 \(\leq 0\) 的数删除。
ARC181E
题目的好的生成树的条件很像最小生成树的形式:所有非树边对应的路径上的边权都小于等于它。(下面一条边 \((u,v)\) 默认为 \(u>v\))
考虑先满足路径上最大为 \(u\) 的条件。赋边权为 \(w_{u,v}=-u(n+1)+v\),此时得到的最小生成树满足最大为 \(u\) 的条件下尽量满足了最小为 \(v\) 的条件,由于边权互不相同,所以最小生成树也是唯一的。同理设 \(w_{u,v}=v(n+1)-u\),此时的最小生成树满足了最小为 \(v\)。图中存在好的生成树的充要条件是上面两个最小生成树相同。判断两棵树相同自然想到随机哈希,给每条边赋一个随机权值,用权值的异或和来判定树是否相等。删边操作的的改动相当于加入了一条 \([dfnl_x,dfnr_y]\) 连向 \([1,dfnl_x)\cup (dfnr_x,n]\) 的最小的边,这是一个二维偏序的形式,随便用个线段树维护一下就行了。
ARC190D
把不确定的位置设为变量跑矩阵快速幂会得到一个每个位置是一个多项式的矩阵,答案就是这些变量取 \([1,p-1]\) 之和。可以证明 \(\sum\limits_{i=1}^{p-1}i^k\) 当且仅当 \(k=p-1\) 是不为 \(0\),且此时和为 \(p-1\),所以只有指数为 \(p-1\) 的位置猜有贡献。由于 \((A^{p-1})_{a_0,a_p}=\sum\limits_{(a_1,a_2\dots a_{p-1})}\prod_{i=1}^{p}{A_{a_{i-1},a_i}}\),先把跑矩阵快速幂算出不关于未知位的贡献,然后把 \(p=2\) 特判掉。然后上面那个式子要有贡献时,\(a_0=a_1\dots=a_{p-1}\) 或 \(a_1=a_2\dots=a_p\)。但注意 \(p=3\) 时 \(a_0=a_2,a_1=a_3\) 也可能是有贡献的,需要特判。
ARC179F
两个操作相当于再 \(n\times 3\) 的网格上像俄罗斯方块一样放入 \(2\times 1\) 或 \(1\times 2\) 的网格,得分位可以消去的行数。把 A,B 的权值设为 \(2,-1\),设字符串的前缀和为 \(s_i\),一段区间 \([l,r]\) 可以被消除当且仅当 \(s_{l-1}\equiv s_r \equiv 0\pmod 6\) 且 \(s_{l-1}\leq s_r\),显然这是必要的,下面的构造可以证明这是充分的,这可以转化为最长不下降子序列求解。对于构造,把两种操作一种放右边,一种放右边,然后调整。如果对于下面这种情况:
|
|
...
把他调整为:
||
...
然后交换两个操作放的位置。还有可能是这种情况:
|
|
|__
...
调整为:
||
|__
就好了。
ARC193B
先考虑 \(s\) 全是 \(0\),此时 \(d_i\) 一定形如一个 \(0,1,1\dots,2,1,1\dots,0,1\dots,1,2\dots\) 的形式。而 \(s_i=1\) 相当于可以将 \(d_i\) 加一。将第 \(i\) 位的状态为 \(\overline{d_is_i}\),\(00,01\) 原来一定 \(d_i=0\),\(11\) 原来可能 \(d_i=0\),\(31,20\) 原来一定 \(d_i=1\),\(21\) 原来可能 \(d_i=1\)。记 \(f_{i,x,y}\) 表示前 \(i\) 位,限制种类,是否有过限制。限制有 \(00,01\) 和 \(31,20\)。因为是环,所以要枚举最后一个点的限制,最后记得加上全程没有限制的答案。
ARC186E
先去掉序列 \(b\) 的限制,现在要求题目上所有序列都是 \(a\) 的子序列。先考虑怎么 check:每次找到最远的位置使得那个位置上的数第一次出现,然后跳到这个位置,这样跳法肯定能跳出最短不是 \(a\) 的子序列的序列,如果跳 \(m\) 次还跳不出去就是合法的。我们不难用 dp 维护这个过程统计答案。
现在就要考虑 \(b\) 不能出现,显然在 \(a\) 后面补一个 \(b_m\) 就是上面的序列,且跳出的序列是 \(b\)。但这个限制不够紧,可能会出现 \(a=\{1,3,2,1,2\},a'={1,3,2,1,2,3},b=\{2,3\},k=3\) 此时 \(\{3,3\}\) 出现在 \(a'\) 但没有出现在 \(a\)。因此我们要阻止有一个序列不经过上面贪心的跳法跳出来。\(p=m\vee b_p=b_{p+1}\) 的情况,我们不需要阻止就已经合法了,否则第 \(p+1\) 的段中 \(b_{p+1}\) 前需要 \([1,b_p-1)\cup(b_p+1,k]\) 都出现过。有了这个条件,就可以 dp 了。记 \(f_{i,j}\) 表示前 \(i\) 位有 \(j\) 段的方案数,转移时就根据当前属于上面那种情况,枚举最后一段的长度转移就好了。

浙公网安备 33010602011771号