CF1408

CF1408

A

sb 题。


B

大片 fst 的题。


C

模拟题。


D

题意

Solution

考虑枚举 \(y\) 的增量 \(\Delta\)

这个时候 \(x\) 对答案的贡献可以预处理。

考虑每一对 \((u,v)\)\(u\) 是合法的,\(v\) 非法,当 \(\Delta \le d_v-b_u\) 时,\(x\) 的增量要和 \(c_v-a_u+1\)\(\max\)

复杂度是 \(\mathcal O(nm+w)\)


E [* easy]

题意

Solution

我们可以考虑这样构图:

将每个元素作为点,集合作为点,如果元素在集合内那么连接这个元素和集合。

不难发现原图上有环等价于这张图上有环。

我们想要最小化删除的代价,等价于最大化保留的代价,跑最大生成树即可。


F [* easy]

题意

Solution

我们发现操作每次可以将两个相同的值赋为相同的,我们认为这个操作是合并集合。

考虑这样来构造:

先两两合并,如果多了一个那么剩余这个元素(单独当作一个集合)

接下来我们有 \(k\) 个大小为 \(2\) 的集合,显然也可以两两合并。

可以这样一直操作下去,每次多余一个就剩余下来,最后我们有若干个,大小形如 \(2^k\) 的集合。

我们发现小的集合的大小之和一定会小于最大的集合,同时考虑最小的集合,我们每次可以通过从最大的集合选一些数出来使其大小倍增。

假设最小的大小到达了次小的大小,那么我们就可以合并这两个集合,如果不够再找最大的借即可。

操作次数大概是 \(\mathcal O(2n\log n)\)


G [* easy]

题意

Solution

请注意,题面保证了 \(a_{i,j}\) 互不相同...(如果你没看到可能会像我一样被卡很久...)

我们发现第二个条件等价于,每个连通块内部的边总是小于连通块外部的边。

我们发现可以从小到大将边排序,然后依次加边。

然后我们发现,一个连通块是满足条件 \(2\) 的当且仅当按此加边方法其内部构成了一个团。

考虑预处理那些连通块是合法,我们考虑类似于生成树一样,借助并查集维护连通块,然后加边量到达 \(\frac{sz\times (sz-1)}{2}\) 时就标记这个连通块合法。

这样已经可以 dp 了,但复杂度是指数的。

考虑优化,我们发现如果将这个流程对应的 Kruskal 重构树建出来,每个合法的连通块都对应一个区间,问题等价于有 \(n+m\)\(m<n\))个区间是合法的,选 \(k\) 个区间不重复的覆盖所有位置的方案数。

将区间挂在 \(r\) 端点上,然后直接 dp 即可,复杂度瓶颈在排序上,为 \(\mathcal O(n^2\log n)\)


H [* hard]

给定长度为 \(n\) 的序列 \(p\)

找出尽可能多的三元组 \((a_i,b_i,c_i)\) 满足:

  • \(1\le a_i<b_i<c_i\le n\)
  • \(p_{a_i}=p_{c_i}=0,p_{b_i}\ne 0\)
  • \(p_{b_i}\) 互不相同。
  • 所有的 \(a_i,b_i,c_i\) 互不相同。

输出最多可以选出多少个三元组,多组数据。

\(\sum n\le 5\cdot 10^5\)

Solution

神仙题,这个题太仙了。这里的做法可能和官方题解相比略为复杂。

\(z\) 为序列中 \(0\) 的数量,那么答案的上界为 \(\lfloor\frac{z}{2}\rfloor\)

假设一个位置左边有至少 \(\frac{z}{2}\)\(0\),那么其左边一定可以选出来一个 \(0\) 来合成答案。同理于右边。

观察到每个点总会满足上述性质中的一条,那么根据此将节点划分为 L/R 两个集合,L 表示满足右边有至少 \(\frac{z}{2}\)\(0\) 的点集,R 表示满足右边有至少 \(\frac{z}{2}\)\(0\) 的点集。

对于每个颜色,假设其被选中,那么一定可以通过调整,使得其位于 L 集合中最右节点,或者 R 集合中最左节点(假设被选出的节点位于 L 集合,那么向右移动一定不会更劣)

这样对于每个颜色我们保留两个节点,分为 \((l,r)\)

对于 \(r\) 元素,我们只需要考虑其右边的选择方案,对于 \(l\),只需要考虑其左边的选择方案,然后将合并的答案与 \(\frac{z}{2}\)\(\min\) 即可。

  • 不难发现如果存在一种方案使得只对于 \(r\) 考虑右边能够匹配/只对于 \(l\) 考虑左边的情况下能够使得答案超过上界,那么一定存在方案达到上界。

这样弱化问题之后,我们考虑网络流建图:

\(S\) 向每个颜色连一条流量为 \(1\) 的边,对于 L 内的每个点向上一个点连边,R 内的每个点向下一个点连边,每个颜色向这两个点连边。

然后将所有 \(0\)\(T\) 连边,不难发现此图上的最大流即为弱化问题的答案。

注意到最大流等于最小割,我们考虑从最小割的角度来统计答案,我们发现假设颜色 \(i\) 不被割去,那么前缀 \(0\) 和后缀 \(0\) 都必须被割去。

于是我们的割去方案一定是割走一段前缀 \(0\),割走一段后缀 \(0\),然后将部分颜色割走。

从左往右枚举前缀 \(0\) 割走的位置,对于每一段 R 中的后缀 \(0\),割走这一段后缀 \(0\) 的答案已经确定,即颜色总数减去他们包含的颜色数。通过线段树即可维护答案。

复杂度为 \(\mathcal O(n\log n)\)

不过看了官方题解好像最后一步有啥高明的解法,但我太愚蠢了,只会这样做。


I [* hard]

给定 \(n,k,c\),以及长度为 \(n\) 的序列 \(a\)(保证元素互不相同)。

操作 \(k\) 次,每次随机选择一个 \(a_i\),然后将其 \(-1\)

对于 \(x=0,1~...~2^c-1\) 输出最后序列的异或和为 \(x\) 的概率。

答案对 \(998244353\) 取模。

\(k,c\le 16,a_i\in [k,2^c),n\le 2^c-k\)

Solution

观察到一个强有力的性质:

  • 考虑形如 \((x\oplus (x-1),x\oplus (x-2)...x\oplus (x-k))\) 这样的 \(k\) 元组,在 \(x<2^c\) 的时候,级别近似于 \(\mathcal O(ck)\)

\(c=16,k=16\) 时搜出来的结果为 \(192\)

我们考虑论证:

观察到 \(x\oplus (x-1)\) 的取值仅有 \(2^t-1\) 的形式。

其中,其取 \(2^t-1\) 表示最低位的 \(1\) 位于 \(t-1\) 位。

\(t> \log k\),那么不难发现 \(x\oplus (x-2)...x\oplus (x-k)\) 均固定了。

否则 \(t\le \log k\),那么后续答案只和其位于 \(\log k\) 位往上走的第一位 \(1\) 所处的位置,和初始后续 \(\log k\) 个位置的具体取值相关,这样可以产生的不同的 \(k\) 元组的数量为 \(c\times 2^{\log k}=ck\) 这一级别 。

所以本质不同的 \(k\) 元组仅有 \(\mathcal O(ck)\) 种。

考虑令 \(t=a_1\oplus a_2....\oplus a_n\)

那么我们可以考虑答案在 \(t\) 上的改变量。

从计数的角度考虑,我们使用 EGF 来统计操作序列的数量,不妨令 \(d_{i,j}=a_i\oplus (a_i-j)\),不难发现我们要求的即:

\[\prod_i^n \bigg(1+\sum_j^k\frac{1}{j!}\cdot x^{d_{i,j}}y^j\bigg)[y^k]\times k! \]

其中,作用在 \(x\) 维度上的卷积为异或卷积,\(y\) 上则为加法卷积。

于是我们得到了一个暴力做法:

枚举这 \(ck\)\(k\) 元组,对其中每个元素固定 \(y\) 然后做 \(FWT_{\textrm{xor}}\) 变换,然后枚举 \(x^{z}\),对于某个 \(z\),答案的贡献可以描述为 \(ck\) 个关于 \(y\) 的多项式的若干次幂的乘积。取其 \(y^k\) 项即可。

当然,由于固定 \(y\) 和枚举多项式之后,每个需要进行 FWT 的元素均为单项式 \(x^{d_{i,j}}\),所以我们可以暴力转 FWT

这样直接枚举这 \(ck\) 个多项式,我们发现我们的任务是计算 \(F(y)^m\),于是直接在模 \(y^{k+1}\) 意义下进行暴力的 \(\ln\)\(\exp\) 变换(均为 \(k^2\)),设 \(c,k\) 平级,复杂度为 \(\mathcal O(c^4\cdot 2^c)\),但是 \(\ln\)\(\exp\) 的巨大常数使人无法通过此题。

我们能否做到更优呢?当然可以:

观察到 \(FWT_{\textrm{xor}}(j)\) 为:

\[\sum_i (-1)^{\textrm{popcount}(i\& j)} \]

对于某个 \(z\) 而言,我们原本想要计算 \(ck\) 个多项式的若干次幂卷积的结果。

但是实际上,对于 \(z\) 而言,\(k\) 元组 \((a_1,a_2...a_k)\) FWT 的结果等效于一个 \(1/-1\) 的序列 \(((-1)^{a_1\&z},....)\) 的结果,这样的 1/-1 的序列可以状压下来。

于是两个 \(k\) 元组如果得到的 \(1/-1\) 序列相同,那么 FWT 后得到的多项式将相同。

原本大概是 \(\mathcal O(c^2\cdot 2^c)\) 级别的运算量,但是加入此优化后需要计算的次数只有 \(1.4\cdot 10^6\) 级别了,那么直接 \(\exp,\ln\) 和暴力卷积即可。

复杂度大概当作 \(\mathcal O(c^3\cdot 2^c)\) 吧?

优雅 の \(\exp\)

\[B(z)=\exp A(z) \]

\[[z^n]B'(z)=[z^n](A'(z)B(z)) \]

\[(n+1)[z^{n+1}]B(z)=\sum_{k} (k+1)[z^{k+1}]A(z)\times B(z)[z^{n-k}] \]

\[[z^{n+1}]B(z)=\frac{1}{n+1}\sum_{k} (k+1)[z^{k+1}]A(z)\times B(z)[z^{n-k}] \]

暴力即可。

优雅 の \(\ln\)

\[B(z)=\ln A(z) \]

\[B(z)'=\frac{A'(z)}{A(z)} \]

暴力求逆即可:\(A(z)\times F(z)=1\to \sum A(z)[z^i]F(z)[z^{n-i}]=0\to F(z)[z^{n}]=-\sum_{i\ge 1} A(z)[z^i]F(z)^{n-i}\),注意 \(A(z)[z^0]=1\)

实际上注意到:

\[B(z)'A(z)=A'(z) \]

\[[z^{n+1}]A(z)(n+1)=\sum_{i+j=n}[z^{i+1}]B(z)(i+1)[z^j]A(z) \]

\[A_{n+1}(n+1)=\sum_{i=1}^{n+1}B_{i}\times i\times A_{n+1-i} \]

\[A_n\times n=\sum_{i=1}^n B_i\times i\times A_{n-i} \]

\[B_n=A_n-\frac{1}{n}\sum_{i=1}^{n-1} B_i\times i\times A_{n-i} \]

然后由于我太菜了,所以常数巨大,最后预处理了 \(\ln\) 才过的这个题.../kk

posted @ 2020-10-01 22:20  Soulist  阅读(216)  评论(0编辑  收藏  举报