zoukankan      html  css  js  c++  java
  • 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(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)),不难发现我们要求的即:

    [prod_i^n igg(1+sum_j^kfrac{1}{j!}cdot x^{d_{i,j}}y^jigg)[y^k] imes k! ]

    其中,作用在 (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)) 为:

    [sum_i (-1)^{ extrm{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^2cdot 2^c)) 级别的运算量,但是加入此优化后需要计算的次数只有 (1.4cdot 10^6) 级别了,那么直接 (exp,ln) 和暴力卷积即可。

    复杂度大概当作 (mathcal O(c^3cdot 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) imes B(z)[z^{n-k}] ]

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

    暴力即可。

    优雅 の (ln)

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

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

    暴力求逆即可:(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)

    实际上注意到:

    [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} imes i imes A_{n+1-i} ]

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

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

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

  • 相关阅读:
    Appium+python自动化17-appium1.6在mac上环境搭建启动ios模拟器上Safari浏览器
    Appium+python自动化18-启动iOS模拟器APP源码案例
    Appium+python自动化16-在Mac上环境搭建
    Appium+python自动化14-native和webview切换
    Appium+python自动化15-查看webview上元素(DevTools)
    Appium+python自动化13-appium元素定位
    Appium+python自动化11-AVD 模拟器
    Appium+python自动化12-adb必知必会的几个指令
    Appium+python自动化10-SDK Manager
    jenkins+gitlab配置
  • 原文地址:https://www.cnblogs.com/Soulist/p/13759310.html
Copyright © 2011-2022 走看看