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\)
- \(a_i=c_i=0,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