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(2nlog n))
G [* easy]
Solution
请注意,题面保证了 (a_{i,j}) 互不相同...(如果你没看到可能会像我一样被卡很久...)
我们发现第二个条件等价于,每个连通块内部的边总是小于连通块外部的边。
我们发现可以从小到大将边排序,然后依次加边。
然后我们发现,一个连通块是满足条件 (2) 的当且仅当按此加边方法其内部构成了一个团。
考虑预处理那些连通块是合法,我们考虑类似于生成树一样,借助并查集维护连通块,然后加边量到达 (frac{sz imes (sz-1)}{2}) 时就标记这个连通块合法。
这样已经可以 dp 了,但复杂度是指数的。
考虑优化,我们发现如果将这个流程对应的 Kruskal 重构树建出来,每个合法的连通块都对应一个区间,问题等价于有 (n+m) ((m<n))个区间是合法的,选 (k) 个区间不重复的覆盖所有位置的方案数。
将区间挂在 (r) 端点上,然后直接 dp 即可,复杂度瓶颈在排序上,为 (mathcal O(n^2log n))
H [* hard]
给定长度为 (n) 的序列 (p)
找出尽可能多的三元组 ((a_i,b_i,c_i)) 满足:
- (1le a_i<b_i<c_ile n)
- (p_{a_i}=p_{c_i}=0,p_{b_i} e 0)
- (p_{b_i}) 互不相同。
- 所有的 (a_i,b_i,c_i) 互不相同。
输出最多可以选出多少个三元组,多组数据。
(sum nle 5cdot 10^5)
Solution
神仙题,这个题太仙了。这里的做法可能和官方题解相比略为复杂。
设 (z) 为序列中 (0) 的数量,那么答案的上界为 (lfloorfrac{z}{2} floor)
假设一个位置左边有至少 (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(nlog n))
不过看了官方题解好像最后一步有啥高明的解法,但我太愚蠢了,只会这样做。
I [* hard]
给定 (n,k,c),以及长度为 (n) 的序列 (a)(保证元素互不相同)。
操作 (k) 次,每次随机选择一个 (a_i),然后将其 (-1)
对于 (x=0,1~...~2^c-1) 输出最后序列的异或和为 (x) 的概率。
答案对 (998244353) 取模。
(k,cle 16,a_iin [k,2^c),nle 2^c-k)
Solution
观察到一个强有力的性质:
- 考虑形如 ((xoplus (x-1),xoplus (x-2)...xoplus (x-k))) 这样的 (k) 元组,在 (x<2^c) 的时候,级别近似于 (mathcal O(ck))
当 (c=16,k=16) 时搜出来的结果为 (192)
我们考虑论证:
观察到 (xoplus (x-1)) 的取值仅有 (2^t-1) 的形式。
其中,其取 (2^t-1) 表示最低位的 (1) 位于 (t-1) 位。
若 (t> log k),那么不难发现 (xoplus (x-2)...xoplus (x-k)) 均固定了。
否则 (tle log k),那么后续答案只和其位于 (log k) 位往上走的第一位 (1) 所处的位置,和初始后续 (log k) 个位置的具体取值相关,这样可以产生的不同的 (k) 元组的数量为 (c imes 2^{log k}=ck) 这一级别 。
所以本质不同的 (k) 元组仅有 (mathcal O(ck)) 种。
考虑令 (t=a_1oplus a_2....oplus a_n)
那么我们可以考虑答案在 (t) 上的改变量。
从计数的角度考虑,我们使用 EGF 来统计操作序列的数量,不妨令 (d_{i,j}=a_ioplus (a_i-j)),不难发现我们要求的即:
其中,作用在 (x) 维度上的卷积为异或卷积,(y) 上则为加法卷积。
于是我们得到了一个暴力做法:
枚举这 (ck) 个 (k) 元组,对其中每个元素固定 (y) 然后做 (FWT_{ extrm{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^4cdot 2^c)),但是 (ln) 和 (exp) 的巨大常数使人无法通过此题。
我们能否做到更优呢?当然可以:
观察到 (FWT_{ extrm{xor}}(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^2cdot 2^c)) 级别的运算量,但是加入此优化后需要计算的次数只有 (1.4cdot 10^6) 级别了,那么直接 (exp,ln) 和暴力卷积即可。
复杂度大概当作 (mathcal O(c^3cdot 2^c)) 吧?
优雅 の (exp):
暴力即可。
优雅 の (ln):
暴力求逆即可:(A(z) imes F(z)=1 o sum A(z)[z^i]F(z)[z^{n-i}]=0 o F(z)[z^{n}]=-sum_{ige 1} A(z)[z^i]F(z)^{n-i}),注意 (A(z)[z^0]=1)
实际上注意到:
然后由于我太菜了,所以常数巨大,最后预处理了 (ln) 才过的这个题.../kk