record 12.25-12.29
CF1909 F1 & F2
我们注意到它给的都是二维平面上矩形框内的点的个数的限制,我们肯定考虑差分对吧,这个还是充要条件。
然后现在我们相当于已知前面那个矩形框里每行每列都恰好一个数,要在差分出来的 L 形里面填充一些数。你考虑目前是 \(n\),上一个是 \(m\),上一个填充了 \(q\),要再填充 \(p\) 个。那方案数就是 \(\sum_{i=0}^p\binom{m-q}{i}\binom{n-m}{i}i!\binom{n-m}{p-i}\binom{n-q-i}{p-i}(p-i)!\)。
这个是把 L 分成两个长方形来考虑的。然后就做完了。
场上想到差分的转化了,但是一直在想转成对每个位置、每个数的限制,没有考虑到前面完全可以当成放在 \((i,i)\)。怎么办呢?
我觉得有一方面原因是,场上一直在尝试同时考虑某一列左边的所有限制,这个是难做的。但是由于这个题目,我们可以自然地考虑某个正方形内的限制。
CF1909 G
你考虑在 \(s\) 里枚举这个 \(x+y\) 和 \(z\) 的断点,然后你会知道 \((k-1)y\) 是谁。
你考虑这时去 check 合法的 \(y\) 的个数。你首先发现长度一定得是这段长度的约数,并且这段长度是个定长。那现在你有了一个大概是 \(O(n\max d(n))\) 的做法。
然后不会了,去看 sol。
sol 里面说,对于 \(|y|\) 相同的,如果有一个 \((a,b)\) 是合法的,那么 \((a+1,b+1)\) 合法等价于 \(s_{b+1}=t_{b+1}\),这个感觉很厉害!
但是还有更厉害的。它同时还说,如果有一个位置 \(p,s_p\neq t_p\),那么所有 \(b\ge p\) 的都不合法。这个我发现了。
你和上面那个结合起来,你发现这个相当于给出了在已知一个合法 \((a,b)\) 的前提下找之后的合法的充要条件。
同样的,反过来,我们发现这个也给出了在已知一个合法 \((a,b)\) 前提下找之前的合法的充要条件。换句话说,我们发现这些东西的合法性是相同的,并且任何其他的都不合法。所以我们只需要对每个 \(|y|\) 相同的组里挑一个 check 就可以了。
check 可以 hash。
这个是怎么想到的呢?先手玩一会?
CF1917 D
为什么调不出来呢?
你考虑把数 \(ik+j\) 写成 \((i,j)\) 的形式,你发现 \((i,j)<(i',j')\) 等价于 \((i=i'\land j<j')\lor i<i'\)。
我们分情况讨论。第一种情况,我们相当于对 \(j\) 内部的逆序对计数,然后乘 n。
第二种情况,我们稍微写一下
而因为我们没有对 \(j,j'\) 有什么限制,所以这样的方案数只跟 \(\lfloor\log_2(\frac{p_i}{p_{i'}})\rfloor\) 的值有关。
我们考虑枚举 \(p_{i'}\),然后算出 \(\lfloor\log_2(\frac{p_i}{p_{i'}})\rfloor=v,i<i'\) 的个数,把答案加上对应的选择 \(j,j'\) 的方案数。
这说明我们需要一个树状数组。
CF1917 E
看了 sol。
我们首先注意到当 \(4\mid k\) 时,我们有简单的解法:每次填充一个 \(2\times2\) 的小正方形即可。
同时注意到 \(2\nmid k\) 时,无解。
接下来要解决 \(k\equiv 2(\bmod 4)\) 的情况。
当 \(k=2\) 时,只有 \(n=2\) 才有解。
当 \(k\ge 6\) 时,我们可以构造出一个 \(3\times 3\),每行不填的那个轮换,然后就转化成了 \(4\mid k\) 的情况。
还有一种情况,\(k=n^2-2\),你发现仍然只有 \(n=2\) 才有解。
感觉我要放慢一点速度了。
CF1917 F
这个,首先有一车凑出 \(d\) 的方案对吧,我们先不管,假装规定了一个方案。
然后怎么看能不能合法呢?说白了,就是把直径尽量均分,别的不是直径的边都要 \(\le\) 较小的部分。这个比较显然。
然后我们考虑怎么给出一个凑出 \(d\) 的方案。暴力背包 bitset 优化即可。
zroi B 芦荀花
这个题就是问你只保留 \(k\) 段 dfn 序上的区间,最后能剩下多少个连通块。
森林的连通块个数是点数减边数,点数我们很清楚,所以我们做边数就可以了。
边数的话,同区间的贡献,怎么都能做。比方说主席树对吧。
不同区间的,看起来很困难,好像只能 \(k^2\) 枚举做。
但是我们要注意我们的操作都是在 dfn 序上的,我们还没挖掘这个东西的性质。
经过观察,发现能对 \([l,r]\) 区间造成贡献的 \(fa\) 全部都在从 \(l\) 到 \(\text{lca}(l,r)\) 的链上。但是,这个链并不能简单表示成常数个区间的并。
场上我就想到这里,后面发现不会做了。好像能产生贡献的区间对真的就是 \(k^2\) 个。
事实并非如此,我们发现,你比方说目前我们在考虑区间 \([l,r]\),然后如果说它跟前面的若干个区间产生了贡献,你会发现它一定会完整覆盖里面的一些区间,这些区间以后不会再产生贡献。而最多与一个不完整区间产生贡献。所以有贡献的区间对至多 \(k\) 个,那么我们现在可以使用之前的主席树算法。
但是这样做大概是有一些问题的。反正我场上交的主席树最后 MLE 了。我们考虑另外一种计算两个区间的贡献的方法。
你发现一个区间里,如果我们目前在某个连通块的根 \(u\) 上,那么下一个连通块的根就是 \(u+sz_u\),我们倍增 check 即可。对于计算同一个区间的贡献,我们倍增算 sz 之和即可。
总复杂度 \(O((n+\sum k)\log n)\)。
场上我在想一个问题:它是怎么处理 \(k\) 个区间的?现在,我们可以说,它把没有贡献的区间对删掉,剩下的就是 \(k\) 个对。
zroi C 豆蔻花
看的 sol。
你考虑这个“终止”很神秘,所以我们大概要找一找终止的条件。
通过对一个 \(2\times2\) 的小结构手玩,我们发现,如果形如两个相同的挨着,另外两个不同的,这样,无论周围的是什么,这个小部分都会循环下去。
然后 sol 里说,这个是充要条件,但是我不懂怎么证,问完花花再说。
那接下来做第一问,我们相当于要填数,避免这样的结构出现。轮廓线 dp 即可。
第二问,要询问一个步数。步数很困难,因为这个权值一直在循环。我们考虑赋出“真实权值”,也就是说,我们给每个位置加上去。
这样,每次操作就是,找周围一圈有没有符合条件的,有的话就把自己 -1。
经过观察,我们发现相邻的项的差可以做到不超过 1。这个其实是由每个 \(2\times2\) 只能有上面的形式保证的。
那么操作就变成在周围一圈 chkmn,同时最后所有位置都会变成同一个数,那么这个数就是全局最小值。
关于树上背包复杂度
我们熟知一个界是 \(O(n^2)\),但是这个没有考虑到背包容量上限 \(V\),我们来证明在有容量上限的时候,总复杂度是 \(O(nV)\)。
我们可以一开始把每个点当成一个孤立的子树,这样我们每次操作都是把一个子树合并到另一个上面去,那显然一共会合并 \(n-1\) 次,考虑 \(>k\) 的叫做大子树,类似有小子树。
我们考虑极大小子树,它们的大小是 \(sz_1,\dots,sz_t\),合并起来的复杂度是 \(ksz_1+\dots+ksz_t=k(\sum sz_i)=O(kn)\),因为极大小子树不交。
考虑合并出极大小子树内部的复杂度,是 \(\sum x_i^2\),而它们的和是一定的,在这个条件下,你通过调整法发现,让最多的数 \(=k\) 是最大的,这部分是 \(k^2\times\frac{n}{k}=nk\)。
考虑大子树的合并,至多 \(\frac{n}{k}\) 次,每次 \(k^2\),一共还是 \(nk\)。
总复杂度 \(O(nk)\)。
CF1498 F
你发现其实是 \(k\) 棵互相独立的树上做博弈,我们看成有向图游戏。对于单个游戏而言,是一棵树,深度从 0 开始,偶数深度的 SG 是 0,奇数是 1,所以我们其实要记录奇数深度的点的个数。
我们放到原树上考虑,你发现比方说 \(k=3\),你要记录的就是 \(3,4,5,9,10,11,\dots\) 深度位置的点的个数。这个随便做做。
ZJOI2019 麻将
这个一眼就是 dp 套 dp 的套路。
我们要算的是 \(\sum_Pval(P)=\sum_P\sum_{S\in prefix(P)}[unable(S)]=\sum_Sunable(S)\sum_{S\in prefix(P)}1=\sum_S[unable(S)](4n-|S|)!\)。
所以,我们要算不合法的集合 \(T\) 的总数,同时要记录它的大小。
我们考虑把当前状态用每个数有几个表示出来,然后我们 dp 的时候一次性把所有值相同的麻将都加进去,这样比较方便。
考虑内层自动机怎么做。七对子单独特判,正常胡牌,比方说目前 \(i\) 牌加了 \(k\) 张,我们需要知道 \(i-2,i-1\) 加了多少张,然后我们可以选一部分凑成顺子/刻子。
状态太多了,接下来人脑优化。
注意到如果 \(i-1\) 剩的一定不少于 \(i-2\) 剩的,不然 \(i-2\) 多的那部分没有用,可以去除。
注意到 \(i-2,i-1\) 剩的不会 \(\ge 3\),否则可以凑成刻子。
现在,这个状态数是 \(8\times5^{2\times3\times3}\approx5e13\),很寄。
但是不要急,我们要坚定信念,通过爆搜,我们发现真正会走到的状态大概几千个。
然后我们套上外层 dp 即可。
很迷惑啊,这个输入的 t 一点用没有。
AGC003 D
这个不是之前看的普及组题目吗?
你考虑把不能选的之间连边,这个就是个最大独立集问题。
你发现,你可以把这个图划分成若干个部分,其中绝大部分部分,可以被划分成二分图,而只有一个部分,它是个团。
所以,对于二分图,我们取两个部分里更大的。对于团,我们取 1 个。
那现在问题就是怎么判断某些数是不是在同一个部分。你肯定想质因数分解,但是这个复杂度不太行。
注意到我们区分的方式相当于是把所有立方因子全都除掉之后,看看得到的数是否相等。
那我们只要预处理 \(^3\sqrt{V}\) 的质数就可以了。
还有一个问题,你怎么判断两个部分是不是在一个二分图里。你把其中一个数平方,然后再把立方因子除掉,就可以了。
然后你发现还是有点爆,这个是 \(O(n\frac{\sqrt{V}}{\log V})\)。
sol 里面,说我们可以考虑现在的数,是我们已知的质数的乘积,再乘上至多两个质数。我们考虑前面这个可以算出来,后面这个只有它是两个相同质数乘积的时候才要除,所以我们预处理根号里的质数就可以了。
AGC003 E
我们首先观察到,两次相邻的操作 \(q_i,q_{i+1}\),如果 \(q_i\ge q_{i+1}\),那么删去 \(q_i\) 并不影响结果。这个结论是显然的。
那我们的操作序列变成了严格递增的,同时一个数加进来就不会被删除掉。那我们有一个想法,就是每次操作,先看看几个完整块,乘一下,然后再查询不完整的部分的 cnt。这个暴力是 \(O(n^2)\) 的。似乎也没什么数据结构能来优化这个东西。
那我们就要分析一下这个过程或者换个思路。先分析这个过程。你发现,这样查询,最后只会找到 \(\log\) 个位置,把这些位置的 cnt 数组合并起来。然后我们发现找这 \(\log\) 个位置的过程真的可以通过倍增优化到这个复杂度,下面的问题就是怎么合并 cnt 数组。
看了 sol。里面说我们逆过来考虑,这个其实根据我们上述推理也能的出来。你比方说你现在正在做最后一个操作,你发现可以找到 \(\log\) 个位置乘个数加起来,再加上一个前缀。但是你没必要知道这 \(\log\) 个位置的值,因为你可以继续向上递归。
所以我们一次询问会产生 \(\log\) 的递归量,我们从后往前向上推标记,可以做到 \(Q\log V\log Q\),第二个 \(\log\) 来自倍增。
之前一直在想维护这 \(\log\) 个位置的哪些信息可以快速合并,但是我们其实不需要显式维护出这些信息。
Luogu P8555
首先我们要做等价条件转换。你考虑对于一个排列 \(a\) 怎么判合法,发现是在问能不能找到一个长度为 \(n-m\) 的序列 \(p\),满足 \(a_{p_i}<a_{p_{i+1}},p_i\le m+i-1\)。你考虑把排列“反演”之后得到另一个排列 \(p'\),相当于要在这个排列上,选出一些递增的位置 \(q\),满足 \(p'_{q_i}\le m+i-1\)。那你考虑一个数 \(v\) 在 \(p'\) 里什么时候能被选,发现是 \(v\le m+i-1\),也就是说 \(v-m+1\le i\),它在一个后缀位置的时候能被选。我们现在把这个东西独立出来了。
但是这个东西好像只能做 \(O(n^3)\) 的 dp。很逊。
看了 sol,我们的要求是 \(p_i\le m+i-1\),这个很不好,因为它跟两个数相关。考虑把 \(p_{1,\dots,n-m}\) 变成 \(p_{m,\dots,n-1}\),这样就变成了 \(p_i\le i\)。
看不懂,不管了。
AHOI2022 山河重整
首先我们使用 FJOI 神秘数 当中的方法考虑一个集合最小的不能表示的和是谁。做法是从小到大考虑,维护当前能表示的前缀 \([1,s]\),若新加进来的数 \(p\le s+1\),那么 \(s\leftarrow s+p\),否则 \(s+1\) 无法表示。
基于这个,我们有一个 \(O(n^2)\) 的 dp,\(dp_{i,j}\) 表示前 \(i\) 个数选了一些和是 \(j\) 的方案数。考虑优化,我们感觉一下,因为互不相同的数加和等于 \(j\),这里面有一个根号。但是不会做。
后面是 sol。
容斥,我们发现这个问题的反面是存在一个数 \(1\le p\le n\),使得 \([1,p)\) 能被表示,但是 \(p\) 无法表示。你发现这个东西等价于只考虑前 \(p-1\) 个数,它们的和恰好是 \(p-1\)。我们记这个方案数是 \(f_i\),表示 \([1,i]\) 能表示,前 \(i\) 个数和恰好为 \(i\)。
但是这个 \([1,i]\) 能表示很难受,不好说。我们考虑再次容斥,你设没有这个限制,也就是说 \(i\) 的互异拆分数是 \(g_i\),这个限制的反面,也就是说 \(\exist j,j\) 无法被表示,设为 \(h_i\),显然有 \(f_i=g_i-h_i\)。
其中,\(g_i\) 的计算可以使用我们之前说的“根号”优化。我们把分拆画出来,长成一张杨表的样子,每一行代表一个数。你发现行数不会很多,那我们可以设 \(dp_{i,j}\),表示我们用了 \(i\) 个数,和为 \(j\),每次有两种操作,一种是把所有数加一然后添加新数 1,一种是把所有数加一。
\(h_i\) 的计算,我们去枚举这个 \(j\),\(h_i=\sum_j f_{j-1}v(j,i)\),其中 \(v(j,i)\) 表示 \([j+1,+\infty)\) 内选出若干个数,和为 \(i-j+1\) 的方案数。这个东西我们肯定想怎么转化一下用跟上面类似的方法来做。如果我们最后在 \([j+1,+\infty)\) 中选了 \(p\) 个数,那么 \(v(j,i)=g_{i-j+1-pj}\)。
看不懂一点。之后再说。
我们继续。
首先,\(g_i\) 的计算之前那种优化当然可以,但是还有另外一种做法。我们考虑杨表的每一行代表一个数,那这样列的长度就是根号,并且列的长度要不降,并且要是一段前缀。\(dp_{i,j}\) 表示仅考虑长度 \(\ge i\) 的列,它们和为 \(j\)。我们可以写出 \(dp_{i,j}=dp_{i+1,j-i}+dp_{i,j-i}+[i=j]\)。
其实这个东西算的方法有很多,我们之所以这么算,是因为后面算 \(h\) 的时候,\(f\) 的贡献需要枚举它的拆分方案中选了多少个数。上面的做法也可以看作是我们每次枚举有多少个数。
\(h\),我们发现这个形式不是很好,但是我们发现我们会 dp \(v\) 出来,所以我们可以考虑把 \(f\) 当成一种类似于“未知数”的东西,放到我们 dp 的合适位置,然后去验证它最后算出来的系数真的是我们想要的。这个验证是容易的,因为我们发现当 \(h\) 的转移方式跟 \(dp\) 相同的时候,\(f\) 的系数 \(dp\) 就是我们想要的。
然后我们找一找合适的位置,你发现它要的是 \([i=j]\) 也就是 \([i-j-p(j+1)=p]\) 也就是 \(i=j+p(j+2)\)。
然后你现在也就清楚了,我们采取上面倒着的 dp 方式,就是相当于枚举了这个 \(p\),找到合适的位置插入。
感觉还有可以研究的地方。
省选联考2023 城市建造
我们先看一些性质。
选出来的 \(V'\) 跟 \(E'\) 有一一对应关系。合法的 \(V'\) 跟合法的连通块划分有一一对应。每个连通块恰好一个 \(V'\)。\(V'\) 是自己连通块的割点。\(G'=(V',E')\) 连通。
接下来我们在 dfs 树上考虑,发现关键性质:选出来的点必须构成连通块。那么我们就有了 dp 的基础。
瞄了一眼 sol,说可以圆方树。并且这个连通的性质可以有一个更好的表述:任意两个选择的点之间的路径上的所有点也必须被选。
那我们在圆方树上考虑。
圆方树上,一个点双如果被选了 2 个以上的,那整个就都要选,这相当于选了这个方点。
两个圆点被选了之后,它们路径上的所有点(包括方点)都要选,也就是说,这也是个连通块。
先考虑 \(k=0\) 的情况,我们枚举连通块的大小 \(d|n\),然后去 chk。chk 就是从下往上,每能够断就断。那相当于是每个子树会给你返回一个自己有没有被断,以及自己这个子树还剩多少。一个圆点就把自己子树加一加返回回去,一个方点就考虑自己断不断然后返回。
再考虑 \(k=1\) 的情况。我们首先发现连通块大小 \(x=\lfloor\frac{n}{m}\rfloor\),其中 \(m\) 是连通块个数。那我们知道 \(x\) 的取值不会超过 \(2\sqrt{n}\) 个。接下来我们可以对每个进行 dp。
感觉很复杂,之后再说吧。

浙公网安备 33010602011771号