• Monoxer Programming Contest 2022(AtCoder Beginner Contest 249)


    A - Jogging

    简单模拟。

    B - Perfect String

    简单模拟。

    C - Just K

    暴力枚举。

    D - Index Trio

    等式等价于\(A_i = A_j \times A_k\)

    枚举\(i\),然后\(O(\sqrt{A_i})\)枚举\(A_i\)的因子,再计数即可。

    E - RLE

    DP。

    \(dp_{i, j}\)为原串长度为\(i\),新串长度为\(j\)的答案。

    \(dp_{i, j}\)的基础上可以新增长度为\(k\)的相同字符,从而转移到\(dp_{i + k, j + f(k) + 1}\),其中\(f(k)\)表示\(k\)的十进制表示长度。

    朴素做法时间复杂度为\(O(n^3)\)

    注意到\(f(k)\)的可能取值只有4个。对于其中一个,以\(f(k) = 1\)为例,则\(dp_{i + x, j + 2}, 1 \le x \le 9\)都可以加上\(25 \times dp_{i, j}\)

    这里用到了区间加可以借助数据结构来加速。

    用数据结构\(t_j\)维护新串长度为\(j\)的答案,则\(dp_{i, j}\)等于\(t_j\)中第\(i\)个位置的值,然后可以\(dp_{i, j}\)可以更新\(t_{j + x}, 2 \le x \le 5\)

    这里只用到了区间加和单点求值,所以树状数组就够用了。

    F - Ignore Operations

    从后往前考虑,遇到一个一类操作,则之前的操作都可以不考虑。后面的一类操直接跳过,因为答案是已经考虑过的;后面的二类操作可以贪心,正数的话直接加,负数的话用一个优先队列维护,操作贪心地用在更小的负数上。

    注意后面有超过\(k + 1\)个一类操作的情况。

    G - Xor Cards

    线性基。

    \((a, b)\)表示正面为\(a\),反面为\(b\)的牌。

    根据异或的性质,\((a, b)\)\((c, d)\)等价与\((a, b)\)\((c \oplus a, d \oplus b)\)

    如果\((x, y)\)中的\(x\)可以由其他牌线\((a_i, b_i)\)性表示,则\((x, y)\)可以通过上述操作转化成\((x \oplus \oplus_{i} a_i, y \oplus \oplus_{i} b_i)\),即\((0, y \oplus \oplus_{i} b_i)\)。这意味着可以在不改变牌正面的限制条件下,用牌\((x, y)\)去增大反面的异或和。

    维护两个线性基,第一个线性基维护牌的正面,尝试将牌插入第一个线性基;如果牌正面上的数已经可以由第一个线性基线性表示了,就把它用上述操作转化成正面为\(0\)的牌,然后插入第二个线性基。

    对于牌正面异或和\(A\)小于等于\(K\)这个条件,而可以从高到低枚举\(K\)的每一位,假设\(A\)\(K\)的更高位都相等,这一位上\(A\)刚好小于\(K\),更低位则可以随意使用。这样就可以枚举到所有可能的情况。

    算答案的话,用第一个线性基可以唯一构造出满足更高位限制条件的数,然后把第一个线性基中更低位的数和第二个线性基合并出第三个线性基,这里第三个线性基中的数可以随意使用。然后用第三个线性基构造出尽可能大的\(B\)

    构造等于某个数以及构造最大值都是线性基的基本操作。

    Ex - Dye Color

    TBA。

  • 相关阅读:
    常见的四种文本自动分词详解及IK Analyze的代码实现
    用java语言通过POI实现word文档的按标题提取
    spark的运行模式
    团队冲刺日志2
    简单之美-软件开发实践者的思考 03
    简单之美-软件开发实践者的思考 02
    简单之美-软件开发实践者的思考 01
    学习进度 15
    构建之法 06
    构建之法 05
  • 原文地址:https://www.cnblogs.com/zengzk/p/16210637.html
Copyright © 2020-2023  润新知