AtCoder

  • AtCoder 做题记录

    • AtCoder Beginner Contest 378

      • A Pairing 检查一下 \(1 \sim 4\) 各有几个。代码

      • B Garbage Collection 根据 \(d\) 求出当天的余数,然后和 \(r\) 比较。代码

      • C Repeatingmap存上一个该数的位置。代码

      • D Count Simple Paths
        深搜板子。代码

      • E Mod Sigma Problem

        维护前缀和 \(S\)。对 \([l, r]\) 的贡献,是 \((S_r - S_{l - 1}) \bmod M\)。得到 \(\mathcal{O}(n^2)\) 的算法。

        需要对 \(M\) 取模很烦人,没有这个可以 \(S_r \times r - \sum\limits_{i = 1}^{r - 1} S_l\) 计算贡献。\(\sum\limits_{l = 1}^{r - 1} S_l\) 可以 \(\mathcal{O}(1)\) 维护。

        考虑去掉 \(\bmod\ M\)。前缀和取膜对答案没有影响。得到 \(\forall i \in [1, n], 0 \le S_i \lt M\)

        \(S_r - S_l\) 转化为 \(S_r - S_l + [S_l \gt S_r] \times M\)。设 \(i \in [1, r - 1]\) 中, \(S_i \gt S_l\) 的个数为 \(T\)

        \(r\) 的贡献为 \(S_r \times r - \sum\limits_{i = 1}^{r - 1} S_l + T \times M\)

        用权值树状数组来求 \(T\), 时间复杂度为 \(\mathcal{O}(n \log n)\)代码

      • F Add One Edge 2

        统计度数为 \(3\) 的连通块的边上有多少度数为 \(2\) 的节点。

        连通块可以用并查集维护。代码

      • G Everlasting LIDS

        LIS 和 LDS 可以用杨表维护。

        \(n+0.5\) 与排列中所有数互异,可以把原序列看为长为 \(A \times B\) 的排列。

        根据 Robinson-Schened Correspondence,两个杨表可以确定一个序列。第一个杨表维护原序列,第二个杨表维护第一个杨表中各个格子在第几轮被第一次填。

        第二个杨表用勾长公式来处理。

        根据题目,最后形成了一个 \(A\times B\) 的杨表 \(S\) 。由原本的形状得,\(n + 0.5\) 插在最后一列。不然杨表的排数会加 \(1\)

        得到条件:\(\forall i\in [1,b), S_{i, A} \gt S_{i + 1, A - 1}\)

        dp,用 \(f_{a_1,a_2,\dots,a_b}\) 表示第 \(i\) 排插入了 \(a_i\) 个数的方案数。

        如果 \(a_i\lt a_i - 1\),可以转移到 \(f_{a_1, a_2,\dots,a_i + 1, a_{i+ 1}, \dots, a_b}\)

        最后一排需要满足特殊的条件,如果在第 \(i\) 排要插入最后一个数,那么 \(S_{i + 1, A - 1}\) 需要已填,不然不满足约束。

        最后的答案为两个杨表的方案数的乘积。代码

    • UNIQUE VISION Programming Contest 2024 Christmas (AtCoder Beginner Contest 385)

      待补:G:等我学会多项式。

    • AtCoder Beginner Contest 387

      • A Happy New Year 2025 输出。代码

      • B 9x9 Sum 开个桶。代码

      • C Snake Numbers

        定义 \(f(n)\)\([1,n]\) 中 snake 数的个数。输出答案为 \(f(R) - f(L - 1)\)。小于 \(10\) 的数视为 snake 数没影响。

        计算 \(f(n)\)

        \(n\)\(m\) 位,从大到小的数位为 \(d_i(1\le i \le m)\)

        小于等于 \(n\) 的 snake 数 \(x\) 有 4 种情况:

        • \(x = n\),如果 \(n\) 本身是 snake 数,对答案有 \(1\) 的贡献。

        • \(x\)\(m\) 位,前 \(k(1\lt k \lt m)\) 位与 \(n\) 相同,第 \(k + 1\) 位小于 \(d_{k+1}\)

          \(k + 1\) 位有 \(\min(d_1,d_{k + 1})\) 种可能,其后有 \(d_1^{m - k - 1}\) 种可能。对答案的贡献为 \(\min(d_1,d_{k + 1})\times d_1^{m - k - 1}\)

        • \(x\)\(m\) 位,第 \(1\) 位小于 \(d_1\)。如果第 \(1\) 位为 \(f( 1\le f \lt d_1)\),对答案的贡献为 \(f^{m-1}\)

        • \(x\)\(k\) 位,\(k \lt m\),第 \(1\) 位的取值范围为 \([1,9]\),记为 \(f\),对答案的贡献为 \(f^{k-1}\)

        代码

      • D Snaky Walkvis 的广搜。多了一个方向的维度。代码

      • E Digit Sum Divisible 2

        没想过写构造题如此狼狈。

        对于一定范围内的 \(n\) 可以暴力查找搜索。

        \(n \gt 10^5\),总是可以构造出结果。只要考虑 \(n\) 的最高位,容易想到做法。代码

      • F Count Arrays

        如果有 \(a_i = j, a_j = i\),说明 \(x_i = x_j\)

        \(a_i,i\) 间建边,会得到一张有向图。将所有 \(x_i = x_j\) 缩点,即将 SCC 缩点,得一张森林。

        在这张森林上跑树形 dp。

        具体来说,设 \(g_{u,i}\) 表示 \(u\) 点取 \(i\) 时的所有可能情况的数量,\(f_{u,j}\) 表示 \(u\) 点取值不大于 \(i\) 时所有可能的数量。得到转移式 \(g_{u,i} = \prod\limits_{v \in son(u)}f_{v, i}\)\(f_{u, i} = \sum \limits_{j = 1}^{i}g_{u, i}\)代码

posted @   FRZ_29  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示