zoukankan      html  css  js  c++  java
  • CF1368 选做

    CF1368 选做

    E

    给定一张 DAG,保证出度不超过 (2),定义操作为:

    • 选择一个点 (x),删去其所有出边。

    选择不超过 (frac{4}{7}n) 个点,使得图上不存在经过超过 (2) 个点的路径。

    保证连边为 (x o y(x<y))

    (nle 2cdot 10^5)

    Solution

    条件等价于 (nge frac{7}{4} extrm{size})

    考虑将点集分成 (A,B,C) 三个集合使得 (Age frac{1}{2}Bge frac{1}{4}C),这样 (n=A+B+Cge frac{7}{4}C)

    我们需要保留 (A,B) 集合,不妨考虑这样构造,保留所有入度为 (0) 的点作为集合 (A)

    (A) 的所有出边的点保留,如果一个点是被这类点中其他点指向的点,那么删去其,这样我们得到了集合 (B) 且有 (Ble 2A)

    然后我们将 (B) 的出边去重并找到,这样得到了 (C),我们删去 (C) 中的点。

    不难发现,此时 (A,B,C) 三类点对答案均没有影响了,所以我们在图上删除 (A,B,C) 这三个集合即可,对于剩余的子图,递归操作即可。

    不难发现,我们消去了 (A+B+C) 个点对答案的影响,但是只删除了 (C) 个点,所以这样构造是合法的。


    CF1368F

    这是一道交互题。

    Alice 和 Bob 在玩游戏,有 (n) 盏灯排成一个圈,顺时针标号为 (1sim n),初始所有灯都是关着的。

    每轮操作为:

    • Alice 选择一个 (kin [1,n]) 然后打开任意 (k) 盏灯(可以重复打开)
    • Bob 关闭一段长度为 (k) 的区间的灯。

    (R) 表示经过若干轮后开着的灯的数量的最大值。

    你需要在不超过 (10^4) 次操作达到这个上界。

    (nle 1000)

    • 请注意,灯是环形摆放。

    Solution

    (A) 表示当前亮着的灯的数量。

    假设当前增加了 (k) 盏灯,里面如果 Bob 无法消去 (k) 盏灯,那么 (A) 将会增大。

    换而言之,如果操作后不存在连续的 (k) 盏灯,那么当前操作就可以使得 (A) 增大。

    考虑 (A) 能够增大的必要条件是什么,即存在一个 (k) 使得操作后有不存在连续的 (k) 盏灯。

    注意到 (R<n),所以我们至少有一盏灯是关闭状态。

    注意到操作之后的亮着的灯的数量为 (A+k),此时仍有连续的灯的数量为 (k-1),从某个灭着的灯处看,我们发现最优情况下每隔 (k) 个位置就有一盏灯是灭着的,我们有 (A+kle n-1-frac{n-1}{k})

    所以 (Ale n-k-1-frac{n-1}{k})

    于是答案的上界为 (max_{k} (n-k-1-frac{n-1}{k})+1),即 (A) 到达上界后仍然可以增大 (1)

    考虑这样的策略,我们先固定此 (k),然后维护集合 (A) 满足 ({xin A,x e 1pmod k})

    不难证明集合中不存在连续的 (k) 个数(注意到 (1) 被 ban 掉了)

    所以我们每次操作总能够选出 (k) 个数,同时使答案至少增大 (1)

    可以证明当 (k=sqrt{n})(下取整)时得到最优解。


    CF1368G

    有一个 (n imes m) 的棋盘,被 (1 imes 2) 的骨牌覆盖,保证 (2|n imes m)

    现在你需要执行以下操作:

    • 移去恰好一个骨牌。
    • 将其他骨牌沿着其长边进行移动。
    • 你需要保证每张骨牌的最终位置与初始位置至少有一个交点。

    求你通过若干次操作后可以得到的所有可能的局面的数量。

    两种局面不同,当且仅当在其中一者中某个位置被骨牌覆盖,而另一者没有。

    (ncdot mle 2cdot 10^5)

    输入格式为:输入一张大小为 (n imes m) 的矩阵,位置 ((i,j))(L,R,U,D) 表示其被一张骨牌的左/右/上/下端覆盖。

    Solution

    假设位置 ((i,j)) 没有骨牌,那么染色为红色,否则为蓝色。

    我们发现答案的上界是 ((n imes m)^2),因为红色格子只有两个。

    然后我们发现由于限制 (2)(3),相当于每张骨牌只能移动一格(假设移动了两格,不难推出矛盾,或者等效于一格)

    我们发现移动一张骨牌,相当于将一张红色格子进行移动,如下面这个例子:

    RBB 变成 BBR

    这样我们将 R 的起点与终点连一条边。

    我们将这张图进行二分染色,我们发现每个骨牌会连出去两条边,恰好一条边连接了两个黑点,一条边连接了两个白点。

    我们的起始状态是两个相邻的白点和黑点,于是这两个点只会在黑色点和白色点中移动。

    接着我们来考虑,什么情况下这两个点的行动是合法的:

    我们假设两个点初始在的位置摆放是横着的,即形如 RR

    我们发现每次使用一张骨牌来移动点会使得他们的竖直或横向距离加 (0/2),所以他们的竖直距离至少为奇数,横向距离为偶数。

    考虑什么情况的行动是非法的,那么就有一张骨牌满足同时协助了两个点的移动。

    我们发现这张骨牌一定不会是竖直的,因为两个点的横向距离此时为 (0),所以这张骨牌一定是横向的,此时两个点移动到他身上时即为非法状态。

    然而此时可以视为我们以这张骨牌为起点的合法移动。

    于是所有可能的移动均可以被视为为合法的。

    我们只需要计算以所有骨牌为起点,两个起点任意进行移动,可以得到的本质不同的棋盘的数量。

    唯一需要注意的点是,从某个骨牌处开始出发,我们进行的移动是不能包含其自身所代表的边的。

    考虑对黑色点,白色点建出两张独立的图。

    我们发现由于只有完整的骨牌,所以这张图上不存在环。因为如果存在环,意味着原图上存在一个类似于闭环的结构。

    即形如:

    ULR
    D.U
    LRD
    

    此时我们发现其内部的点数必然为奇数。类似的(通过手玩+大胆猜测)可以说明对于更复杂的闭环结果,其内部的点数仍然为奇数。

    由于我们的图完整的放置了所有的骨牌,所以这类结构无法存在,于是这张图上无环。

    基于这样的考量我们假设补充一个点代表外界,那么此时这张图上有 (nm+1) 个点,(nm) 条边,没有环,那么一定是树。

    我们发现一对黑点和白点可以产生贡献的条件为:

    1. 他们是一张骨牌的两个点。
    2. 存在一张骨牌满足删去其代表的两条边后可以联通他们所在的连通块。

    由于我们已知树的形态,所以接着我们这样考虑:对于每张骨牌形如 xLRy,我们连接 (x o R)(y o L) 的两条有向边,假设出去了那么对外界建一个点,不难发现此时一对黑白点能够产生贡献当且仅当他们存在一对祖先是一组骨牌的 (L,R)

    我们考虑对这棵树进行 dfs。

    当我们在树上进行 dfs 的时候,我们每遇到一个 (R/L),就给对应的另一棵子树打上标记。

    不难发现我们只需要统计序列上非 (0) 的元素的个数。

    由于元素的非负性,我们统计最小值,和最小值的出现次数。

    然后用总数减去即可,然后我们发现每个对子会被计算两次,所以答案除以 (2) 即可。

    这样只需要线段树即可解决此题,复杂度 (mathcal O(nlog n))


    H

    给定一张 (n imes m) 网格,每行/每列的边界处均有一个端口,端口有红色也有蓝色。

    你需要在这些网络中连接一些线缆,满足:

    • 线缆必须连接一个红色端口和蓝色端口,每个端口至多作为一条线缆的端点。
    • 线缆的每一段必须是水平/竖直的,只能在交点处转弯。
    • 任何两条线段不能有长度大于 (0) 的相交部分,即只能在端点处相交。

    定义网络的容量为,在此限制下,至多可以连接的线缆数。

    进行 (q) 次修改,每次修改为将一段区间的端口颜色取反。

    对于每次修改,计算答案。

    • (mathbf{for~H1})(n,mle 10^5,q=0)
    • (mathbf{for~H2})(n,m,qle 10^5)

    Solution

    • (mathbf{H1})

    先考虑 (mathbf{H1}),即没有修改如何处理。

    发现每个线段只能被经过一次,考虑网络流建模

    (S) 连向红色端口,蓝色端口连 (T),每两个节点连一条容量为 (1) 的双向边,即反向边和正向边容量均为 (1)(或者说连接无向边)

    我们可以认为这张图是无向图,于是不妨从最小割的角度考虑此题。

    等价于找到最小的边集,使得红色点和蓝色点不联通。

    我们发现这张图有类似于网格图般的形式,此时我们发现其最小割等价于将每个点赋一个颜色,如果相邻两个点颜色不同答案 (+1)

    同时,我们发现答案的上界是 (min( m{黑色点}, m{红色点})) 的数量,换而言之,答案一定小于等于 (n+m)

    假设 (m>n) 即每行的长度大于每一列,我们考虑每一列的贡献。

    我们发现假设每一列的颜色均存在一个分界点使得颜色不同,那么此时答案的下界是 (m)(即所有颜色均对齐)

    我们发现假设每一列均存在两个分界点,那么答案的下界将到达 (2m>n+m)

    于是我们不可能使得所有列均存在至少两个分界点。

    假设部分列均只有一个分界点,某个列存在两个分界点,那么考虑将其调整为只有一个分界点的情况,不难发现一定不会变劣。

    于是每个列只有一个分界点。

    仍然考虑 (m>n)

    假设 (m>nge 2),我们发现假设某个列为颜色相同,且相邻的列均为只有一个分界点。

    我们发现此时答案将所有列调整为均为同色状态或者将所有列调整为只有一个分界点,两者肯定有一个比现状优。

    这是因为只有一个分界点的列至少会产生 (1) 的贡献。可以类似于将颜色集体推下去,这样可以减少边界上颜色产生的贡献(注意到边界至少有 (2) 的贡献,这样等价于行的贡献的最大值)

    或者将颜色均调整过来,来减少列的贡献。

    于是我们发现答案只有两种情况:

    1. 所有列均同色。
    2. 所有列均只有一个分界点。

    考虑情况 (2),我们发现我们必然会使得所有列的分界点位于相同的位置。(或者说行形如:全 A,全 A ... 全 A,全 B,全 B ... 全 B 这种形式)

    因为如果不相同此时这一行至少有 (1) 的贡献,那么可以选择两种方式调整为相同(要么另一边缩进来,要么另一边出去)这样至少可以达到低于不相同的贡献。(因为两种选择的贡献和为总量,那么必然有一者小于总量除以 (2)(即原贡献))

    然后我们发现 (n=1) 的时候必然会满足所有列相同。

    所以最后答案的情况仅有两种:

    1. 所有列颜色相同。
    2. 所有列均只有一个分界点。

    然而这样需要根据 (m)(n) 的大小关系进行分类讨论,太麻烦了,所以我们考虑弱化限制 (2) 变成所有行颜色相同的情况下的答案。

    不难发现其包括了原命题,且我们得到了一个对于任意 (m,n) 均适用的限制:

    1. 所有列颜色相同。
    2. 所有行颜色相同。

    最终答案为这两种答案取 (min) 的结果。

    于是可以使用 dp 来统计贡献。复杂度 (mathcal O(n+m))

    • (mathbf{H2})

    考虑 H1 的 dp 式:

    (f_{i,0}=min(f_{i-1,0},f_{i-1,1}+n)+w(i,0))

    (f_{i,1}=min(f_{i-1,0}+n,f_{i-1,1})+w(i,1))

    • 另一面的处理类似。

    考虑使用 ddp 来维护其,这样我们的矩阵转移应该形如:

    [egin{bmatrix}f_{i-1,0}\\f_{i-1,1}end{bmatrix} imes egin{bmatrix}w(i,0)&w(i,0)+n\\w(i,1)+n&w(i,1)end{bmatrix}=egin{bmatrix}f_{i,0}\\f_{i,1}end{bmatrix} ]

    考虑怎么支持翻转一段区间。

    我们发现可以维护一个翻转标记,同时提前维护底层的点的状态和翻转后的状态。注意需要维护 (4) 种状态。

    这样使用 ddp 维护矩阵乘法即可。

    复杂度 (mathcal O(q(log n+log m)))

    代码又枯了,有空会回来补的,最近被代码搞烦了,不太想写。

  • 相关阅读:
    2020年寒假假期总结0210
    2020年寒假假期总结0209
    2020年寒假假期总结0208
    2020年寒假假期总结0207
    2020年寒假假期总结0206
    yolo-v4:Optimal Speed and Accuracy of Object Detection解析
    Docker 练习
    tensorflow2.0 GPU版本镜像文件
    flink项目实战
    高等数理统计知识点
  • 原文地址:https://www.cnblogs.com/Soulist/p/13775678.html
Copyright © 2011-2022 走看看