2021.9做题记录

CF715E Complete the Permutations

假设 \(p,q\) 已知。
假设 \(p_i=i\),那么我们连边 \(i\to q_i\),答案就是 \(n-\) 环的个数。
如果 \(p_i\) 不等于 \(i\),我们可以建立辅助点, \(i\to p_i,j\to q_j\),这样得到的图的环数和原图是等价的。
进一步的,我们可以删掉每一个 \(i\),也就是直接 \(p_i\)\(q_i\) 连边,不难发现这样也是等价的。
所以现在问题变成了要让 \(p_i\)\(q_i\) 连起来,求这个图的环的个数。
考虑以每一个 \(p_i\) 往后连的一串链。
发现对于每一个位置,只可能有四种情况:\(PQ,P0,0Q,00\)
对于 \(P=Q\),我们可以把 \(0Q\)\(P0\) 缩成一个 \(00\),这样是等价的
同样,对于 \(P_2=Q_1\),我们可以把 \(0Q_1\)\(P_2Q_2\) 缩成一个 \(0Q_2\)
当然还有类似的可以缩一下。
当然如果已经有的 \(PQ\) 类型的已经构成了一些环,我们就直接把这些扔掉最后再加回来就可以了。
然后对于每一个 \(x\),如果有 \(q_i=x\)\(p_i\)\(0\),那么他不能作为一个链头,否则以 \(x\) 出发的都有一条链,并且一定是上面那四类中的一个。
假设这样的链最后分别有 \(n_1,n_2,n_3,n_4\) 个。
考虑按顺序把这些链连成环。
首先先把 \(PQ\)\(P0\) 放一起,他们可以任意连,并且连的时候必须要消耗一个 \(00\)(这里是 \(p_i=q_i=0\)\(i\))。
这两类的情况可以直接第一类斯特林数计算。
接下来考虑第三类,他不能接在 \(P0\) 的后面,因为这样的话那两个 0 可以任意的填,我们无法确定,其他情况需要一个 \(p_i=q_i=0\) 来当中介。
所以转移类似于第一类斯特林数的转移,有:

\[f(i,j)=(i-1-n_2)f(i-1,j)+f(i-1,j-1) \]

接下来考虑第四类,他不能接在第二类的后面,不能接在第三类的前面,不能接在自己的两边,自己也不能成环,同时我们注意到,第二类的后面和第三类的前面一定中间隔了一个,同理第四类的两边也和第二类的后面或者第三类的前面之间隔了别的,所以可以直接减掉这些情况获得合法的情况数,所以有转移:

\[f(i,j)=(i-1-n_2-n_3-2\times (i-1-n_1-n_2-n_3))f(i-1,j-1) \]

但是对于所有的 \(p_i=q_i=0\) 的边,他们可以随便交换顺序,因此需要乘上这样的 \(i\) 的个数的阶乘。
\(\mathcal O(n^2)\)

code

P3175 [HAOI2015]按位或

考虑 \(S\) 一个位置至少有一个变成了 1 的期望步数
那么显然是

\[\sum_{k=0}^\infty (k+1)P(U\ xor\ S)(1-P(U\ xor\ S)) \]

这个时候可以想到 min-max 容斥。
这个东西在期望下也是成立的。
也就是

\[E(\max(S))=\sum_{T\in S}(-1)^{|T|+1}E(\min(T)) \]

然后注意到上面那个东西实际上可以直接 fwt 一遍做出来。
然后就解决掉了
注意这里没有 \(p(S)=1-p(U\ xor\ S)\)

code

P5400 [CTS2019]随机立方体

考虑填数的过程,我们换一种理解方式,从大到小往里面填数
相当于每次随机一个 \((i,j,k)\),如果这个坐标已经出现过,那么就不管他,否则填这个数进去。
一个位置成为极大值当且仅当填他的时候他的三个坐标都没出来过。
发现这个恰好 \(k\) 个不好处理,但是我们好做至少 \(k\) 个的情况,所以考虑二项式反演
考虑至少 \(k\) 个怎么求
首先是有顺序的选 \(k\) 个出来,\(A_n^kA_m^kA_l^k\),同时我们还要在那些位置选到这个点,\((\frac{1}{nml})^k\)
然后对于每一个间隙,考虑我们连续随机了 \(i\) 次,并且我们随机的时候后面的钦定极大值位置的坐标不能选,假设后面还有 \(j\) 个极大值。

\[g(j)=\prod_{i=0}^{\infty}(\dfrac{n-j}{n}\dfrac{m-j}{m}\dfrac{l-j}{l})^i \]

直接等比数列一下

\[ans_k=(\dfrac{1}{nml})^kA_n^kA_m^kA_l^k\prod_{i=0}^{k-1}g(i) \]

然后二项式反演

code

CF955F Heaps

首先这个数据范围看上去就像根号分治
如果 \(k\geq \sqrt n\),显然答案不是 1 就是 2,这个非常好计算
如果 \(k<\sqrt n\),我们可以 dp,利用 nth_element 求出第 \(k\) 大,做到 \(\mathcal O(n\sqrt n)\)
但是 \(3e5\) 不太跑的过去
因此要换状态,这次不是根号分治,是 12 分治
\(n=1\) 很简单
\(n\leq 2\) 的时候,我们注意到这个深度不会超过 \(\log n\),所以我们可以用 \(g_{u,j}\) 表示 \(u\) 中答案为 \(j\) 的最大的 \(k\) 是多少
转移的时候,对于每一个 \(g_{v,j-1}\),拎出来排序之后取 \(\min\{p_i,i\}\) 就好了

\(\mathcal O(n\log ^2 n)\)

code

模拟赛某题 Tokyo

description
一棵树,每个点有 \(a_i,b_i\)\(q\) 次询问,每次问 \(x\) 字树里选一些点,使得他们的 \(b\) 的和小于 \(k\),并且 \(a\) 的和最大,求最大值
\(n,b,k\leq 5000,q\leq 10^5\)

solution
\(\mathcal O(n^3)\) dp非常简单,然后考虑优化
可以启发式合并
\(\mathcal O(n^2\log n)\)

CF1406E Deleting Numbers

注意到 \(10^5\) 内只有 9592 个质数,也就是说我们需要一种方法让每个质数只被枚举一次。
如果暴力的话肯定是先 B 一次再 A 一次,但是这样需要 2 次。
注意到对于所有 \(>\sqrt n\) 的质数,他们之间是没有冲突的,所以我们可以把这些数按照 \(\sqrt m\) 分组(\(m\) 是质数个数),进去之前算一下现在一共有多少个数,然后把里面全 B 一遍,这个时候如果没有 \(x\) 我们是可以算出来减少量的,这样我们在 \(m-\sqrt m+2\sqrt m+2\sqrt m\) 的时间内解决了后半部分。
对于前半部分,我们 \(2\sqrt m\) 查询,一共次数是 \(m+4\sqrt m\),最后查询的那几次就是零头
这样就可以通过了

CF1416D Graph and Queries

考虑倒序建出一个等价的重构树出来
然后这个时候的问题就变成了子树里面求 max,单点修改
线段树维护即可
code

CF1439B Graph Subset Problem

这个问法就挺奇怪的
先考虑第一类的情况,如果一个点的度数 \(<k\),我们就可以把这个点删掉,因为他不可能作为答案
这个时候又有一些点度数 \(<k\) 了,接着删,类似拓扑排序
如果最后还有点剩下来就可以
考虑第二类的情况,显然此时有 \(k\sim \sqrt m\),而可能作为这个完全图的节点个数最多是 \(\mathcal O(\dfrac{m}{k})\) 的,暴力判断复杂度是 \(\mathcal O(mk)=\mathcal O(m\sqrt m)\)
我们只需要在第一类删的时候对于恰好 \(k-1\) 的度数的点暴力判断这 \(k\) 个点可不可行,因为一个 \(k\) 的完全图一定有一个点的度数恰好是 \(k-1\),否则他会在第一类中算一遍
利用哈希表可以 \(\mathcal O(1)\) 判断一条边是否存在,\(\mathcal O(m\sqrt m)\)
需要卡常
code

CF1469F

考虑二分答案,为了让利益最大化每条链肯定是用中点去接,并且长的链先接。
并且把所有点接到上面接点深度不会超过 \(2\log n\),所以可以开一个数组暴力维护一下
复杂度就是两个 log

CF1500C

考虑倒过来考虑
相当于是以倒数第一次换的为第一关键字,倒数第二次换的为第二关键字... 原来的行号 为第 \(k+1\) 关键字排序
要求对于前几个关键字全部相等的部分下一个关键字要 \(\geq\)
这样是 \(\mathcal O(n^3)\)
然后用 bitset 来优化,记录 \(a_{i,j}\geq a_{i-1,j}\)\(j\) 即可

CF348E Pilgrims

首先可以换根 dp 找到子树里和子树外离他最远的点
顺便可以维护一下最远可以选到哪里
如果子树内距离和子树外距离相等肯定不行
否则树上差分即可

code

CF1548C The Three Little Pigs

显然答案是 \(\sum_{i=0}^n\binom{3i}{x}\)
写成生成函数,就是 \([x^k]\sum_{i=0}(1+x)^{3i}\)
等比数列一下,上面可以组合数,下面只有3次,直接大除法

code

P3246 [HNOI2016]序列

发现直接搞不太好搞,因此可以莫队
考虑在 \([l,r]\) 变成 \([l,r+1]\) 的时候的增量
显然都是 \(r+1\) 为右端点的区间造成的
找到区间最小值的位置 \(p\)\([l,p]\) 的贡献是 \(a_p\times (p-l+1)\)
对于右边的,发现是一个单调栈的情况,我们预处理 \(f[i]=f[pre_i]+a_i\times(i-pre_i)\)
直接 \(f_r-f_p\) 即可。
这样就是 \(\mathcal O(n\sqrt n)\)

延续上面的做法,我们发现对于每一个 \([p,r]\) 以他为右端点的方案数都可以 \(f_i-f_p\)
所以维护 \(f_i\) 的前缀和,就可以 \(\mathcal O(1)\) 单次询问

\(\mathcal O(n\log n)\)

posted @ 2021-09-05 17:15  YuukiYumesaki  阅读(77)  评论(0编辑  收藏  举报