AtCoder
-
AtCoder
做题记录-
-
B Garbage Collection 根据 \(d\) 求出当天的余数,然后和 \(r\) 比较。代码。
-
C Repeating 用
map
存上一个该数的位置。代码。 -
D Count Simple Paths
深搜板子。代码。 -
维护前缀和 \(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)\)。代码。
-
统计度数为 \(3\) 的连通块的边上有多少度数为 \(2\) 的节点。
连通块可以用并查集维护。代码。
-
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)
-
B Santa Claus 1 简单模拟。代码。
-
简单dp,设 \(f_{i, j}\) 表示以第 \(i\) 项为结尾,元素间隔为 \(j\) 的值。
容易得到转移方程:\(f_{i, i - j} = f_{j, i - j} + 1\ (a_i = a_j)\)。
暴力转移。代码。
-
事实证明我的代码能力有多差。
很简单,用
map<int, set<int> >
定义一个容器,然后每次二分。代码。学习了Drifty的实现方法。
-
事实再次证明我的代码能力有多差。
-
想象图像,大概呈一条折线,显然答案在相邻两点间。代码。
待补:G:等我学会多项式。
-
-
定义 \(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 Walk 带
vis
的广搜。多了一个方向的维度。代码。 -
没想过写构造题如此狼狈。
对于一定范围内的 \(n\) 可以暴力查找搜索。
\(n \gt 10^5\),总是可以构造出结果。只要考虑 \(n\) 的最高位,容易想到做法。代码。
-
如果有 \(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}\)。代码。
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现