zoukankan      html  css  js  c++  java
  • IOI 2021 集训队作业胡扯「1, 50」

    粉兔 AKIOI (详细揭秘)

    粉兔做不完作业是怎么回事呢,小编也很好奇,但事实就是这样

    粉兔 AKIOI 是假的

    A (WF         2014) : A B C E F G H I J K L
    B (WF         2015) : B E G H J K L M
    C (WF         2016) : A B D F H I J K M
    D (WF         2017) : A B D G H J K L
    E (WF         2018) : C D E G H I J
    F (WF         2019) : B C F G I J K
    G (NEERC      2017) : F G H I J K L
    H (NEERC      2016) : B C D G I K L M
    I (NEERC      2015) : B C D H I J K L
    J (NEERC      2014) : C D E G H I
    K (NEERC      2013) : A C D E G H I K
    L (CERC       2017) : B C D E I K L
    M (CERC       2016) : B D E G I J L
    N (CERC       2015) : C E F G I J L
    O (CERC       2014) : A B E G J K L
    P (CERC       2013) : A D E G H J
    Q (NEERC,NSub 2017) : C D E F G H J
    R (NEERC,NSub 2016) : B D E G H I J
    S (NEERC,NSub 2015) : D F G I K
    T (NEERC,NSub 2014) : C E F H K
    U (NEERC,NSub 2013) : C H I J L

    表格

    试题一 完成情况 试题二 完成情况 试题三 完成情况
    UC DG RB
    HC IB FJ
    GK UH QH
    EE DJ IH
    HL MI EJ
    MB UI ED
    AA BG ML
    CF TE QG
    PH UJ BB
    CI SD NG
    DK LD IJ
    NC BJ FK
    CH NJ RH
    QF BE KI
    AC PG HM
    PJ ID EG
    SI KC GI
    OG CK DB
    QE GH NI
    OL KA MG
    SG NL KH
    QJ KG AB
    KD IL NF
    CM NE HD
    DH EC BM
    LC CD JI
    DL ME PE
    LI AI RJ
    SF II HG
    RE LL OA
    FB QD DA
    TC AE CB
    GF AG JC
    PA TH EH
    AJ TK EI
    UL AF SK
    BH RD OK
    FC JD OE
    TF FF DD
    CJ HK MJ
    FG GL AL
    FI IC QC
    MD OJ HI
    KK JH OB
    BK GJ KE
    CA IK LE
    RI LK PD
    JE LB HB
    BL RG AH
    AK GG JG

    绿的表示主要没看题解,的表示主要看了题解。


    FB. Beautiful Bridges

    本题是在获得集训队训练资料前就已经做过的,故写在开头。

    详细题解请见:ICPC World Finals 2019 题解评测链接

    FG. First of Her Name

    本题是在获得集训队训练资料前就已经做过的,故写在开头。

    详细题解请见:ICPC World Finals 2019 题解评测链接

    2020-10-13

    AK. Surveillance

    题意简述

    有一个周长为 (n) 的圆,等距分割为 (n) 小段,按顺序编号为 (1 sim n)

    给定 (k) 个圆上的弧,每个覆盖一段连续的小段 ([a_i, b_i]),问最少选取其中多少个弧可以覆盖整个圆,或报告不可能完成。

    数据范围:(3 le n le {10}^6)(1 le k le {10}^6)

    〔「SCOI2015」国旗计划〕弱化版。

    判断可行性很简单。

    对于求出最小选取的弧的数量,考虑倍增,对于每个小段,求从此处出发使用 (2^j) 个区间最多能向前遍历多长的距离。

    时间复杂度为 (mathcal O (k + n log n))评测链接

    2020-10-16

    OL. Outer space invaders

    题意简述

    (n) 个物体,第 (i) 个物体在时刻 (a_i) 出现,在时刻 (b_i) 消失,权值为 (d_i)

    在某个时刻,你可以用 (R) 的代价消灭所有权值 (d_i le R) 的,且此时已经出现但还未消失的物体。

    问消灭所有物体的最小代价之和,物体消失了不算被消灭。

    数据范围:(1 le n le 300)(1 le a_i < b_i le {10}^4)(1 le d_i le {10}^4)

    一开始容易想出一个贪心的做法,看到 (n) 这么小有点怀疑,果然贪心错了。

    我们先离散化时间,把 (a_i, b_i) 的值域降至 (mathcal O (n))

    我们考虑 (R) 最大的那次操作,一定是把 (d_i) 最大的物体消灭了,所以也肯定同时消灭了同时存在的其它物体。

    所以我们在 (d_i) 最大的物体的 ([a_i, b_i]) 中枚举一个执行这次消灭的位置,然后分成左右两个子问题。

    子问题中仅包含出现时间段完全落在子问题区间中的物体,因为其它都肯定被消灭了。

    所以变成了个区间 DP。

    时间复杂度为 (mathcal O (n^3))评测链接

    P.S. 有点像〔USACO 2019.12 Platinum T1. Greedy Pie Eaters〕,LOJ #3226,看起来不是个区间 DP 但是确实是?

    GG. The Great Wall

    题意简述

    给定长度为 (n) 的三个数列 (a, b, c)(下标范围为 (1 sim n)),一个整数 (r)(满足 (1 le r < n)),和一个正整数 (k)

    可以选取两个下标 (x, y) 满足 (r le x < y le n)

    考虑两个长度为 (r) 的下标区间 ([x - r + 1, x])([y - r + 1, y]),并据此定义数列 (h)

    • 如果下标 (i) 不属于这两个区间,则 (h_i = a_i)
    • 如果下标 (i) 恰好属于一个区间,则 (h_i = b_i)
    • 如果下标 (i) 属于全部两个区间,则 (h_i = c_i)

    最后,定义价值为 (displaystyle sum_{i = 1}^{n} h_i)

    所有的 (x, y) 的选取方案有 (frac{(n - r) (n - r + 1)}{2}) 种,求其中价值第 (k) 小的方案的价值。

    数据范围:(2 le n le 3 imes {10}^4)(1 le k le frac{(n - r) (n - r + 1)}{2})(1 le a_i < b_i < c_i le {10}^6)

    类似于〔「NOI2010」超级钢琴〕。

    (c_i) 减去 (a_i + b_i),再令 (b_i) 减去 (a_i),令 (displaystyle mathrm{Sum} = sum_{i = 1}^{n} a_i)

    再令 (displaystyle {mathrm{S}b}_k = sum_{i = 1}^{k} b_i)(displaystyle {mathrm{S}c}_k = sum_{i = 1}^{k} c_i),即 (b, c) 的前缀和数列。

    考虑如果 ([x - r + 1, x])([y - r + 1, y]) 有交或刚好有触碰,即 (x < y le x + r)

    • 则价值为 (mathrm{Sum} + {mathrm{S}b}_y - {mathrm{S}b}_{x - r} + {mathrm{S}c}_x - {mathrm{S}c}_{y - r})
      变换一下变成 (mathrm{Sum} + ({mathrm{S}c}_x - {mathrm{S}b}_{x - r}) + ({mathrm{S}b}_y - {mathrm{S}c}_{y - r}))

    考虑如果 ([x - r + 1, x])([y - r + 1, y]) 无交且不刚好触碰,即 (x + r < y)

    • 则价值为 (mathrm{Sum} + ({mathrm{S}b}_x - {mathrm{S}b}_{x - r}) + ({mathrm{S}b}_y - {mathrm{S}b}_{y - r}))

    我们考虑二分答案 (mathrm{Sum} + mathrm{mid}),统计价值小于等于 (mathrm{Sum} + mathrm{mid})((x, y)) 数对的数量。

    对上述两种情况分别统计,我们固定 (x),统计符合条件的 (y) 的数量。

    对于每个 (x),合法的 (y) 是一个区间,且对于 (x) 的连续变化,区间的变化量是 (mathcal O (1))

    而且我们是需要在值域上求一维偏序,所以考虑以值域维度建数据结构。

    可以发现主席树符合我们的要求,对两种情况分别建立对应的主席树,然后对于固定的 (x) 查询值域前缀上的 (y) 数量即可。

    时间复杂度为 (mathcal O (n log^2 (n v))),其中 (v) 为值域,评测链接

    P.S. 可以发现,此处没有必要使用主席树的,每次对二分的答案进行计算的时候扫描线即可,但是如果不做值域离散化的话,这种方法在时间和空间复杂度或常数上均没有显著改进,所以此处使用了主席树。

    QE. Equal Numbers

    题意简述

    (n) 个数 (a_1, a_2, ldots , a_n)。你可以对它们执行操作:选取任意一个数 (a_i),把它乘以任意正整数 (x),即 (a_i gets a_i cdot x)

    请你对所有 (k)(满足 (0 le k le n))求出:执行 (k) 次操作后,这些数中不同的数值个数的最小值。

    数据范围:(1 le n le 3 imes {10}^5)(1 le a_i le {10}^6)

    在所有质因数维度分解后,这实际上是一个无限维偏序空间,可以把一个点移到大于它的位置上。

    在这个空间中,初始有一些位置本来就有点了,还有一些位置初始时是空的。

    (k) 一定时,显然不会对一个点操作多次(除非取 (x = 1) 进行操作)。

    所以我们假定一个点一定只会操作最多一次,不允许 (x = 1) 的操作,把条件改成进行 (le k) 次操作即可。

    也就是有一个大小不超过 (k) 的点集会进行操作,其它的点都在原地不动,我们可以给出几个基本结论:

    • 初始时位置相同的点,如果其中一个被操作了,它们全体一定会一起被操作,且操作的 (x) 均相同。这是因为如果其中有不被操作的点,则全体都不被操作不会使答案更劣,如果全体都被操作了,令它们的操作的 (x) 相同,也不会使答案更劣。
    • 位置相同的一群点,被操作后有可能落到了初始时本来就有点的位置上,也可能落到初始时是空的位置上。
      • 如果有一群这样的点落到了初始时是空的位置上,则令它落到的位置变为一个无穷远点(各维度坐标足够大以保证在题目范围内的所有数值都能转移到它,比如 (operatorname{lcm}(1, 2, ldots , {10}^6)),是所有范围内的数的倍数),而且令所有被操作的点都落到同样的这个无穷远点上,不会使答案更劣。
      • 否则,所有被操作的点都落到了初始时就有点的位置上,而这个位置上原有的点一定不会被操作。这是因为如果它们被操作了,移动到其它点上去了,则之前的那个点也是可以移动到这个新位置上的,如果新位置上原有的点仍然被操作了,我们继续去找新的新位置,直至最终找到一个原有的点没有被操作的位置,把之前访问到的所有点集都移动到这个位置即可。上面的过程能够成立主要依靠:第一点是,转移关系是偏序,所以具有传递性;第二点是,点的数量是有限的,所以这个过程可以在有限步内结束。

    也就是说,初始时 (a_i) 在数值上相同的一群 (i),它们的行动是统一的,而且之后只有两种情况:

    1. 所有被操作的点都跑到了同一个无穷远的位置上,且这个位置在初始时肯定是没有点的。假设有 (c) 个初始时数值不相同的点集被操作了,则此时答案就比 (k = 0)(即初始状态)时减少 ((c - 1)),因为原来的 (c) 个位置上的点消失了,增加了一个无穷远位置上的点。
    2. 每个被操作的初始时数值不相同的点集,都移动到了一个初始时就有点的位置上,且这个位置上原有的点是不会被操作的。假设有 (c) 个初始时数值不相同的点集被操作了,则此时答案就比 (k = 0)(即初始状态)时减少 (c)。注意这个情况和第一种情况相比,有的初始点集是无法被操作的,也即那些无法转移到其它初始时就有点的位置上的点集,换句话说就是这个偏序关系上的「最大值」,在原问题中体现为数集 (a) 中没有它的倍数的那些数。

    我们对这两种情况分别处理即可。可以开一个桶然后做一个倍数的统计,然后确定出能参与第二种情况的点集。之后再对两种情况中的可操作点集按照大小从小到大排序,分别维护两种情况的答案数组。最终输出时输出两个数组中对应位置的较小值即可。

    时间复杂度为 (mathcal O (n log n + v log v)),其中 (v) 是值域,评测链接

    BJ. Tile Cutting

    题意简述

    如果有一个长为 (x) 宽为 (y) 的矩形,其中 (x, y) 是整数,你可以选择两个整数 (a, b) 满足 (1 le a < x)(1 le b < y)

    然后在矩形长为 (x) 的边的左起 (a) 个单位长度,宽为 (y) 的边的左起 (b) 个单位长度处标记点,对四条边均是如此。

    同时你需要保证这四个点是关于矩形的正中心,中心对称的。顺次连接四个点可以得到一个平行四边形。

    记这个平行四边形的面积为 (w)。我们定义 (f(w)) 为能够得到面积为 (x) 的平行四边形的有序数对 ((x, y, a, b)) 的数量。

    (Q) 次询问,每次询问给出 (l, r),你需要求出 (f(w))(l le w le r))的最大值,以及取到这个值的 (w) 的值,有多个 (w) 取最小的。

    数据范围:(1 le Q le 500)(1 le l le r le 5 imes {10}^5)

    (c = x - a)(d = y - b),此时 (w = (a + c) (b + d) - a d - b c = a b + c d)。其中 (a, b, c, d) 都是正整数。

    也就是说令 (f(w))(mathbf{OGF})(F),则我们有 (F = G^2),其中 (G)(sigma_0 (w))(因数个数函数)的 (mathbf{OGF})

    我们只需筛出因数个数函数,然后 NTT 做卷积,然后建立 ST 表进行 RMQ 的查询即可。

    时间复杂度为 (mathcal O (v log v + Q)),其中 (v) 为值域即 (max r)评测链接

    2020-10-20

    LI. Intrinsic Interval

    题意简述

    给定一个 (1 sim n) 的排列 ([pi_1, pi_2, ldots , pi_n])。再给出 (m) 个询问,第 (i) 个询问给出 (a_i, b_i),你需要求出包含区间 ([a_i, b_i]) 的最小连续段。

    数据范围:(1 le n, m le {10}^5)

    析合树可做,但我不会。

    我们考虑用线段树求连续段的方法,有两种方法:一种是扫描线维护两个单调栈;另一种是在值域上扫描,固定值域区间右端点,维护每个值域区间左端点对应形成的段数,在每个段的最左侧统计就是维护相邻两个位置,左边在值域区间外而右边在值域区间内的位置个数。

    我喜欢用后者,因为两个单调栈很不好玩。

    但是在值域上做扫描线真的可以去求下标区间上的相关问题吗?

    没关系,只要先把排列 (pi) 变成它的逆就行了,也就是说我们对 (pi^{-1}) 执行上述算法,并且把 ([a_i, b_i]) 看成在值域上的区间。

    我们注意到关于连续段的一个性质,也就是如果两个连续段相交但不相包含,则它们的交也是一个连续段。

    通过这个性质可知,答案是唯一的,而且假设答案为 ([l, r]),我们还有 (r) 是所有包含 ([a_i, b_i]) 的连续段中最靠左的右端点。

    我们提前把区间 ([a_i, b_i]) 挂在它的右端点 (b_i) 处。在扫描线的时候扫到 (b_i) 后,就把 (a_i) 加进一个大根堆中。

    尝试回答询问时,我们按 (a_i) 从大到小从大根堆中取出元素,然后在线段树上查值域区间左端点在 ([1, a_i]) 之间时是否存在连续段,如果存在,返回左端点最靠右的一个。此时如果返回的是存在,则该询问 (i) 的答案就是 ([l, r]),其中 (l) 为返回值,(r) 为当前扫描线扫到的右端点位置。这种方法最终表现常数较小,可能是因为线段树的访问次数较少。

    时间复杂度为 (mathcal O (n log n + m log m))评测链接

    2020-10-21

    IK. King’s Inspection

    题意简述

    给定一张有 (n) 个点,(m) 条有向边的有向图,问是否存在哈密顿圈。如果有,输出一种方案。

    数据范围:(1 le n le {10}^5)(0 le m le n + 20)

    这题就非常搞笑了,注意到一个哈密顿圈已经有 (n) 条边了,最多多出 (20) 条。

    我们先判断是不是每个点都有出度,如果是的话,出度 (ge 2) 的点就只有最多 (20) 个了。

    我们先对出度 (= 1) 的点进行一个缩点,以降低后面的复杂度。

    然后对那最多 (20) 个点进行枚举出边的 DFS,不难证明这部分最多 (2^{20}) 种情况。

    枚举完之后的 check 因为已经缩点过了,所以只要 (mathcal O (m - n)) 次运算就能判断。

    时间复杂度为 (mathcal O (n + (m - n) 2^{m - n}))评测链接

  • 相关阅读:
    Java虚拟机JVM学习05 类加载器的父委托机制
    java 接口
    java 抽象类
    代码块(2)
    获取超额收益的思考
    HttpServer
    交易过程思考
    A股时间窗口
    redash学习记录
    MySQL学习记录
  • 原文地址:https://www.cnblogs.com/PinkRabbit/p/IOI2021Homework1.html
Copyright © 2011-2022 走看看