abc 蓝题方法整理
trick
基本算法
搜索
最优性剪枝/保证枚举合法保证复杂度 : 42, 166
约束与两边有关系考虑双向搜索 : 54
数据范围较小考虑爆搜: 81, 162
从可能性较少的位置向较多的位置搜 : 162
记忆化搜索优化 : 162
meet-in-the-middle处理总状态不多的搜索 : 162, 193
边数爆炸依然可以 bfs : 178
二分
二分答案 : 56, 206, 226
对二进制位二分答案 : 139
倍增
前途唯一条件单调可以倍增 : 68, 226
前缀和/差分
把高阶前缀和转化为式子 : 112
把矩阵拆成几个不同规则的差分矩阵 : 119
差分处理等差数列加 : 127
贪心策略
贪心(极端值) : 5, 16, 18, 22, 24, 28, 45, 117, 149, 163, 173, 204
贪心(区间更优) : 17, 88
贪心(补偿最小维持较小极差) : 20
贪心(括号串提前抵消) : 41
贪心(从大到小拆解) : 82
贪心(到中位数距离和最小) : 88
贪心(从小到大考虑每一个能否加入) : 95
贪心(字典序考虑开头元素) : 120
贪心(字典序) : 161, 228
贪心(交换法判断最优) : 220
反悔贪心
序列上的网络流状决策问题考虑反悔贪心 : 109
反悔贪心要维护两个相邻时刻间最优解的转化 : 109
dp
dp 设计
dp转移顺序(值从小到大) : 4, 66
dp(状态压缩) : 4, 47, 53, 58, 169, 180, 185, 186, 203, 233
dp(以修改的最后一个位置为状态) : 22
dp(换根) : 35, 195
在换根时用递推维护子树外信息 : 79
dp(按数位从前向后) : 29, 46, 52, 63, 93, 175, 192
多个数同时数位 dp : 175
决策区间的一端考虑区间 dp : 38
区间从中间断开考虑区间 dp : 61
每次消除一个区间考虑区间 dp : 91, 110, 182
遇到消掉后左右靠拢考虑枚举右端点和谁匹配作区间 dp : 72
区间扩张考虑去区间 dp : 132, 151, 164
dp维护式子系数 : 48, 188
填数不区分是什么数只关心个数无需状压 : 52, 93
自身是否被占领作为状态 : 58, 63, 87, 113, 117, 143
对元素顺序有要求考虑插入dp : 66, 137
已知前面有多少个位置不能选考虑插入 dp : 73, 125
能够知道当前元素和前面的元素产生多少贡献考虑插入 dp : 83, 145
与第 k 大有关的 dp 考虑记录目前有多少个记录进答案和标准第 k 大是多少 : 84
破环为链 : 87, 113
破环为链后考虑滑动窗口添加删除首尾元素的影响 : 194
环起点是否被占领作为状态 : 87, 113
需要不重的计数 dp 考虑上一次重复的位置在哪 : 89
把 dp 能否选择的限制压入状态 : 96
把需要的提前贡献作为一维 : 105, 121
把目前已有的代价作为一维 : 107, 137, 143, 167, 168, 175, 205, 219, 230
末尾的权值作为状态 : 123, 130, 132, 136, 151, 165, 170, 179, 196, 205
贡献与某个量无关不必塞进状态 : 136, 145
前后回文位置有约束就考虑从中间向两边填 : 179
恰好是一个整体的方案数用是多个整体并集来容斥 : 180
超大值域背包 : 183
dp优化
dp优化(双指针) : 2
dp优化(树状数组) : 7
dp优化(数论分块) : 15
dp优化(单调队列) : 34, 164
dp优化(单调栈) : 92
dp优化(贪心) : 45, 230
dp优化(从整体角度考虑变化) : 229
dp优化(矩阵快速幂) : 55, 58, 113, 130, 165
转移的分档不多 : 102, 107
前/后缀和优化 : 20
子集枚举 : 47
值域定义域互换 : 57
把 dp 的一维二分答案掉 : 105, 163
枚举
枚举可能的答案 : 12, 20, 25, 26, 49, 50, 51
变更主元 : 12, 31, 38, 51, 61, 66, 118, 132, 139, 147, 149, 153, 156, 166, 170, 171
分治
根号分治 : 37, 153, 222, 233
在图上操作与相邻点有关可以根据度数根号分治 : 75
对质因数根号分治: 85, 97
对跨度根号分治 : 191
构造
构造(\(\oplus_{i=0}^{2^m-1}i=[m=1]\)) : 10
构造(极端值) : 16
答案在上下界内任取 : 31, 216
答案上界可以达到 : 148
归纳性构造 : 98
把图上的构造压缩到树上 : 104, 206
奇偶性判断是否有解 : 146, 206, 216
树的重心上的构造 : 220
分讨
分讨掉特殊质数 : 33
对直径长度奇偶性分讨 : 76
设置阈值分讨策略 : 80
分讨最优策略 : 115
数学
复杂度
神秘复杂度(约数) : 3, 50, 69
神秘复杂度(调和级数) : 12
答案有倍数约束有上界保证考虑调和级数 : 172
相加有保证不同的只有根号 : 70
寻找一个相等关系的解可以把未知数拆成两个根号级别大小的集合去碰撞 : 129
\(2^n\) 个状态的全 \(0\) 子段数量和 \(O(n2^n)\) : 185
位运算
加法拆解为位运算 : 43
用二进制处理并 : 27
异或的自反性 : 25
对于 \(a<b<c\) 有 \(\max(a\oplus b,b\oplus c) < a\oplus c\) : 168
进制
取模转化为进制 : 32
倍数关系考虑进制 : 46
有进制考虑进位 : 32, 46
二进制位间贡献独立 : 223
数学式处理
写出通项 : 36, 56
类似的东西放在一起 : 25
运算形式统一 : 43
对 min 操作分讨拆式子 : 20
对绝对值做分讨拆开 : 138
使用对顶堆/线段树/平衡树支持插入/删除动态维护中位数 : 74
减少变量 : 19, 174, 181
用 \(\frac{10^x-1}{9}\) 描述 \(1111\dots\) : 78
转化成指数和 \(1\) 同余 : 78
横纵坐标分开考虑: 146, 183
元素之间贡献独立 : 198
平均值大于 \(k\) 转化为减 \(k\) 后前缀和大于 \(0\) : 152
倍数约束条件弱化为余数条件 : 175
方差等于平方的平均值减平均值的平方 : 186
把各部分贡献列成式子再观察 : 189
平均值转化为斜率 : 199
期望概率
期望
枚举方案推期望 : 21
期望的线性性拆解加减 : 23
概率转化为方案数 : 169
列方程解期望 : 80
\(\sum_{i=1}^niP(x=i)=\sum_{i=1}^nP(x>\geq i)\) : 155
概率
一件概率为 \(p\) 的事 \(k\) 次中恰出现 \(j\) 次的概率是 \(\binom{k}{j}p^j(1-p)^{k-j}\) : 101
考虑加入一个元素枚举这个元素出现次数计算对概率影响 : 101
预处理状态间转移的概率 : 130
计数
双射转化
把答案序列做前缀和做双射 : 89
容斥
简单容斥 : 6, 160, 232
正难则反 : 23, 70, 160
二项式反演容斥 : 27, 99
过程中有线性约束考虑反射容斥 : 59
组合计数
钦定计数 : 24, 99
组合数相邻项的比例关系 : 36, 140
\(\binom{n}{m}=\binom{n-1}{m-1}+\binom{n-1}{m}\) 求解递推式 : 94
图论计数
树的拓扑排序计数 : 35
转化计数
数颜色转化为上一次出现 : 44
排列
周期是排列每个环的 lcm : 81
一个值域 \([1,n]\) 序列是一个个基环树森林 : 140
矩阵
矩阵快速幂
矩阵有变化的矩阵快速幂 : 13
数论
质数和约数
相近的数gcd不大 : 53
想获得 \(\sqrt V\) 以上的质约数可以用 \(\sqrt V\) 以下的去筛 : 85
原根
\([1,P-1]\) 中任何一个数都可以用 \(g^k\) 唯一表示 : 69
欧拉函数
\(a^x\equiv 1 \rightarrow x |\varphi(P)\) : 78
BSGS
矩阵 BSGS : 129
CRT
模意义方程组结果模数是方程组所有模数的最小公倍数 : 141
同余方程拆为对质数的同余方程组 : 228
高斯消元
用方程组描述问题后高斯消元 : 223
线性基
线性基维护异或生成的集合 : 95, 139
数据维护
合并等价元素 : 22, 210
基于单调性的双指针 : 20, 88, 108, 163, 184
期望概率同时维护 : 21, 135
同时维护 \(x^0,x^1,x^2\) 的期望 : 135
前后缀同时维护 : 21
顺序无关则可以排序 : 24, 96
多个式子分别用 BIT 维护 : 112
数据结构
线段树
线段树模拟 cdq 分治 : 124
带修的二分考虑线段树二分 : 144, 152
值域过大的线段树考虑动态开点 : 144
带删除转化为不带删除用线段树分治 : 168
带删除的修改操作考虑在线段树上每个节点用 set 维护永久化标记 : 201
删掉一些边相当于每个点连一些区间 : 178
线段树支持区间乘区间加 : 187
主席树维护在线数点 : 197
不好上传标记考虑标记永久化 : 201
可合并信息用线段树 : 202
单调栈/单调队列
有单调性端点的区间最值用单调栈/单调队列 : 34, 86
寻找字典序最小的序列用单调栈 : 161
找下一个比自己小的用单调栈 : 181
堆
对顶堆模拟线段树二分 : 173
模型处理
区间
一个区间按照 \((l,r)\) 刻画为平面上的点 : 208, 218
不同
对于"不同"的约束可以考虑枚举哪个二进制位不同 : 104
差分约束
遇到对前缀和的约束时考虑差分约束 : 71, 224
对称
反复关于 \(x\) 和 \(x+1\) 做对称就能平移一个点 : 146
括号串处理
用左右富裕的括号数表示一个括号串 : 41
交换处理
最小交换次数等于对应位置排列逆序对 : 83, 88
连通块内交换一定能排序 : 90
把 \((l,l+1),\dots(l,n)\) 交换一遍等于循环移位 : 111
答案处理
拆贡献(查询拆到修改) : 5
拆贡献(整体拆到二进制位) : 19
拆贡献(期望拆到概率) : 23, 70, 128, 160
拆贡献(整体拆到元素) : 24, 155, 156, 160
拆贡献(多步后的期望拆到每一步) : 55, 187
均值不等式求式子最值 : 80
整体维护所有选项的答案 : 127
询问处理
询问差分到前缀 : 30
尝试把多轮操作合并 : 111
有贡献的位置是区间 : 133
如果分界点不多考虑枚举每一段中的代表元素求答案 : 176
可达性
可达性问题用 bitset 优化 : 116
相邻项
与相邻项有关考虑相临项性质 : 66
偏序
把约束条件看成偏序去贡献 : 119, 138
最小表示法
最小表示增加约束防止贡献重复/增加好的性质 : 120, 133, 135
有值
钦定每个元素在不同的位有值保持独立且非0 : 223
严格递增
单调递增子序列转化为单调非降子序列 : 227
图论
tarjan
割点会断开连通块 : 190
并查集
并查集维护连通块 : 98, 142, 157
并查集跳过无用元素 : 157
网络流
用最小割刻画连通性 : 1
最大流刻画有约束的匹配问题 : 60, 106, 121
有容量限制的点考虑拆点 : 60, 177
查询可以放在行列点的中间而非两边 : 60
枚举一个部的点集列式子 : 87
考虑增量跑网络流来在流量最大时最小化某条边的流量 : 121
最大流较小的网络复杂度较低 : 177
二分图
隐藏的二分图(相加为质数) : 121
隐藏的二分图(网格图) : 134
方格图
网格图点转化为行和列的连接 : 14, 60, 134
最短路
用一个属性建立分层图 : 39
到一些点的最短距离考虑多源最短路 : 104, 166
图上到某一结点的距离在值域上连续 : 136
带状态的最短路 : 204
图论最短路刻画最优化问题 : 214
跑 dij 做最短路计数 : 2331
虚点
枚举删掉的边数最短路 : 178
对于单独点权贡献拆点为边权 : 77
枚举删掉的边数最短路
匹配
最大匹配=点数-最大独立集 : 79
图论覆盖转化为匹配 : 134
度数
给无向图定向约束入度/出度数量级 : 116
最小生成树
曼哈顿距离最小生成树代价和是 \(O(n\sqrt n)\) : 138
启发式合并
连通块问题考虑启发式合并 : 211
计算几何
矩形面积并
用矩形面积并维护容斥 : 208
三角形
直角/钝角三角形考虑最大角 : 6
凸包
凸包求 \(y+kx\) 的最大值 : 147
二分法求直线和凸包的交点 : 159
用交点法反应点和凸壳的位置关系 : 159
哈希
哈希(串相等) : 25, 65, 114
哈希(几何图形) : 62
字符串
kmp
跳 fail 枚举border : 114
用 border 反映周期 : 114, 171
用 fail 来维护匹配状态 : 156
AC 自动机
AC 自动机维护与多个模式串的匹配状态 : 165
与图论结合
用路径描述字符串 : 123
构造提前组合的字符 : 125
字典树
字典树维护字符串前缀 : 128
字典树上每个子树也是区间 : 151
trie 树维护最大异或数对 \(O(n \log V)\) : 168
trie 树维护一个固定数和其他数的最大异或值 \(O(\log V)\) : 168
树论
dfs
用dfs来维护父链信息 : 40, 126
线段树在 dfs 中动态维护全局信息 : 77
子树操作考虑 dfn 序 : 77
dfs的过程让子树合法 : 104
树上的 dfn 序列每个子树是一个区间 : 110
直径
直径中心左右分别考虑 : 76
直径必共用中心点 : 76
最大距离考虑树的直径 : 77, 126
点分治
点分树上任意两点的 lca 在原树上在 \((u,v)\) 路径上 : 150
点分树上每个节点都是它子树的重心 : 150
虚树
虚树分别做每一类点 : 217
树剖
每次扩展最长链考虑长剖 : 225
不太多
除法次数为 \(\log V\) : 57
每次取根号很快能到 \(1\) : 102
状态不太多 : 64
博弈论
建图刻画博弈 : 65
拓扑排序和一败则胜原则递推可平局博弈结果 : 65
离线算法
莫队
发现询问支持加入和删除一个元素考虑莫队 : 97, 99, 154, 234
二次离线消掉 log : 234
随机化
所有元素各自的和都是 \(k\) 的倍数考虑随机化 : 97
绝对众数考虑随机化 : 131
题解
1. [ABC010D] 浮気予防
tag: 最小割
trick: 用最小割刻画连通性
简要题意:
现有一个无向图 \(G=<V,E>\) , 现有一个特殊点集 $S \in V $, 你可以执行下面的操作若干次, 使得节点 \(1\) 与 \(S\) 中任意一个节点不联通.
操作 \(A\) : 从 \(V\) 中删除一条边.
操作 \(B\) : 从 \(S\) 中删除一个特殊点.
要求输出最少操作次数. \(n \leq 300\).
题解:
发现要求类似于让集合 \(S\) 和集合 \(T\) 不联通, 想到最小割.
把 \(1\) 作为源点, 把每一个特殊点连向汇点, 并且给予 \(1\) 的边权, 表示可以花掉 \(1\) 的代价删除这个关键点.
另外, 把 \(E\) 中每一条边建立边权为 \(1\) 的双向边, 表示花掉 \(1\) 的代价断掉一条边.
跑最大流即可.
2. [ABC017D] サプリメント
tag: dp, 双指针
trick: dp优化(双指针)
简要题意:
现有一个长度为 \(n\) 的数列 \(a_i\) , 值域为 \([1,m]\) 的整数. 我们称一个合法的划分 \(1 = x_1 < x_2 < x_3 < \dots < x_{k-1} < x_k = n+1\) 需要满足: 对任意一个 \(i \in \mathbb{Z} \ \cap \ [1,k-1]\) , 都满足 \(a\) 在区间 \([x_i,x_{i+1})\) 中的元素互不相同. 划分的段数 \(k-1\) 并未指定. 输出合法的划分个数. \((n,m \leq 10^5)\)
题解:
我们发现,如果设 \(l_i\) 表示以 \(i\) 为右端点, 那么合法的一段能拓展的最左端点, 那么这个 \(l\) 数列是非严格递增的.
由题意可得, 设前 \(i\) 个元素的答案为 \(f_i\) , 枚举上一次断点位置, 可得转移方程:
我们发现可以用双指针扫到 \(l_i\) , 然后用前缀和优化一下就可以了.
3. [ABC020D] LCM Rush
简要题意:
tag: 莫比乌斯反演
trick: 神秘复杂度(约数)
给定 \(n,k\) , 求: \(\sum_{i=1}^n \text{LCM}(i,k)\).
\((n,k\leq10^9)\).
题解:
直接做变形:
记 \(F(n,m) = \sum_{i=1}^ni[(i,m)=1]\),则有 \(ans=k\sum_{g \ |\ k}F(\lfloor\frac{n}{g}\rfloor,\frac{m}{g})\).
对 \(F\) 做变形, 考虑莫反:
暴力模拟即可, 复杂度为 \(O(\sum_{i | k}\sqrt{i})\).
跑得很快.
4. [ABC025D] 25個の整数
tag: dp, 状态压缩
trick: dp转移顺序(值从小到大), dp(状态压缩)
简要题意:
有一个 \(5×5\) 的网格, 在其中填入 \(1∼25\) 之间的数, 使得每个数恰好出现一次, 并且满足以下条件:
对于同行或同列的任意 \(3\) 个连续位置, 其中的数均不构成单调数列。
现有一个尚未完成的局面, 保证其中至少已经填了 \(5\) 个数, 求合法方案数.
题解:
剩余的位置不超过 \(20\) 个, 想到状压 dp . 从上到下从左到右转移的话, 我们不好刻画单调数列这个条件, 需要额外记录很多信息.
考虑从值域从小到大转移, 设 \(f_S\) 表示 \(S\) 内的格子已经填过, 目前填了 \(|S|\) 个数 .
这样形成单调数列当且仅当一边已经填过, 另一边没填. 直接判掉就可以了.
5. [ABC027D] ロボット
tag: 贪心
trick: 拆贡献(查询拆到修改), 贪心(极端值)
简要题意:
初始坐标为 \(0\) , 现有一个指令串,你需要依次执行:
若为 +
或 -
, 你的得分加上/减去你的坐标.
若为 M
, 你的坐标加上或减去 \(1\).
若要求最后位置为 \(0\) ,输出最大化的得分.
指令串长度 \(n \leq 10^5\).
题解:
把每次 +
/ -
对得分的贡献拆到移动上, 发现每个 +
会让前面每次移动有 \(1\) 的贡献, 而 -
则有 \(-1\).
我们可以倒着扫一遍指令串, 求出来每一次 M
对应的贡献系数 \(a_i\).
设有 \(k\) 个 M
操作, 由于最后要回到原点, 这意味着有一半的 \(a_i\) 需要加到答案, 另一半要减掉. 由于要最大化答案, 那贪心的把大的一半加上, 小的一半减掉就可以了.
6. [ABC033D] 三角形の分類
tag: 计算几何, 容斥
trick: 简单容斥, 直角/钝角三角形考虑最大角
简要题意:
在二维平面上有 \(n\) 个点, 第 \(i\) 个点是 \((x_i,y_i)\) 满足任意三点不在同一直线上. 求出任意三点构造出锐角三角形, 直角三角形, 钝角三角形的数量.
\(n \leq 2000\).
题解:
注意到直角三角形和钝角三角形都可以被那个最大的角唯一代表, 所以我们统计直角和钝角的个数代表他们, 再用 \(\binom{n}{3}\) 减掉他们就是锐角三角形的数量了.
枚举每个点作为角的顶点, 然后把其他的点按照相对于这个点的极角排序, 再用双指针去扫就可以统计了.
7. [ABC038D] プレゼント
tag: LIS
trick: dp优化(树状数组)
简要题意:
给出 \(n\) 个物品, 每个物品有 \((x_i,y_i)\) 的属性, 在这 \(n\) 个点组成的有向图 \(G\) 中, \(E = \{(u,v) \ | \ x_u<x_v \ \wedge y_u<y_v \}\). 求 \(G\) 的最长链.
题解:
按照二位偏序的做法, 先对第一维排序后, 问题转化为第二维的 LIS , 注意第一位相等的边界情况即可.
8. [ABC061D] Score Attack
tag: spfa最长路
trick: /
简要题意:
给定 \(n\) 个点的带边权有向图 \(G = (V,E)\), 求从 \(1\) 开始, 到 \(n\) 结束的最长链长度, 若没有上界输出 inf
.
\(|w_i|\leq10^9,n\leq2000\).
题解:
从 \(n\) 节点跑反图dfs , 防止判到走不到 \(n\) 的正环输出 inf
.
然后从 \(1\) 节点跑 spfa 即可.
9. AtCoder Express
tag : dp
trick: /
简要题意:
有一列车, 要驶过 \(n\) 个区间, 第 \(t_i\) 个区间有 \(t_i\) 秒, 限速 \(v_i\) ,第一个区间开始和最后一个区间结束时速度必须是 \(0\) ,加速度的绝对值不能超过 \(1m/s^2\) .问最多能走多远.
题解:
注意到最优策略每个转折点的时间和速度乘 \(2\) 之后一定是整数, 因此只要时间速度都乘 \(2\) 之后 dp 求最大值即可.
10. [ABC126F] XOR Matching
tag: 异或, 构造
trick: 构造(\(\oplus_{i=0}^{2^m-1}i=[m=1]\))
简要题意:
你需要构造一个长为 \(2^m\) 的数列 \(a_i\), 使得 \([0,2^{m-1})\) 中的每个整数都出现恰好两次, 并且满足:
对任意一个整数 \(p \in [0,2^{m-1})\) ,设它两次出现的位置是 \(l,r\ (l < r)\) , 则有 \(\oplus_{i=l}^ra_i=k\).
给定 \(m,k\), 若存在构造方案, 输出一种; 若不存在, 输出 -1
.
\(m \leq 17,k \leq 10^9\).
题解:
首先, 若 \(k \geq 2^m\) , 显然无解.
对于 \(m=0\) 的情况 , 手动构造 0 0
.
对于 \(m=1,k=0\) 的情况, 手动构造 0 0 1 1
.
对于 \(m=1,k=1\) 的情况, 发现无解.
对于 \(m>1\) 的情况, 注意到有 \(\oplus_{i=0}^{2^m-1}i=0\), 为了异或两个就变成 \(0\) 的性质, 考虑对称的构造:
这样不难发现对于任何不为 \(k\) 的数都是合法的, 而对于 \(k\) 来说, 由于有上面的结论, 所以也是合法的.
11. [ABC127E] Cell Distance
tag: 组合计数
trick: /
简要题意:
有一个 \(n \times m\) 的矩形, 你会从中选出 \(k\) 个坐标为整数的位置 \((x_1,y_1),(x_2,y_2)\dots(x_{k},y_{k})\) .
你定义一个选出 \(k\) 个位置的方案的权值为\(\textstyle \sum_{i=1}^{k-1}\sum_{j=i+1}^{k}(|x_{i}-x_{j}|+|y_{i}-y_{j}|)\).
你需要求出, 所有可能的选出 \(k\) 个位置的方案的权值之和, 答案对 \(1000000007\) 取模.
- $ 2\ \leq\ n\ \times\ m\ \leq\ 2\ \times\ 10^5 $
- $ 2\ \leq\ k\ \leq\ n\ \times\ m $
题解:
横纵坐标分别计算, 考虑一组 \(|x_i-x_j|\) 会被贡献多少次, 那么先把所有横坐标排序, 注意到只要选 \(i\) 和 \(j\) 就会有贡献, 因此会贡献到 \(\binom{nm-2}{k-2}\) 次. 推式子即可.
12. [ABC128F] Frog Jump
tag: 枚举
trick: 枚举可能的答案, 神秘复杂度(调和级数), 变更主元
简要题意:
现有一个变量 \(x=0\), 你指定两个常量 \(A,B\), 然后你进行第一次操作.
第奇数次操作时, \(x\leftarrow x+A\); 第偶数次操作时, \(x\leftarrow x-B\).
每次操作后:
- 你的分数增加 \(s_x\);
- 若 \(x\) 的值之前出现过, 则你失败;
- 若 \(x\geq n-1\), 则你失败;
- 若 \(x=n-1\), 则结束.
请你最大化分数.
\(3\le n\le 10^5\),\(-10^9\le s_i\le 10^9\),\(s_0=s_{n-1}=0\)。
题解:
注意到没办法很好的推式子, 但是这道题对于 \(A,B\) 的约束很严格, 首先必须恰好到达 \(n-1\), 则有 \(A+(A-B)k=n-1\), 另外的, 由于不能超过 \(n\), 则有 \(A<n\), 同时可以认为 \(B<A\). 由于不能重复, 那么 \(A-B\nmid A\).
综上有 \(A-B>0\), 那么就可以枚举 \(A-B\) 和 \(k\), 这样就可以调和级数, 同时算出来 \(A\) 和 \(B\).
不合法的 \(A-B\nmid A\) 判掉, 分数使用前缀和即可.
13. [ABC129F] Takahashi's Basics in Education and Learning
tag: 矩阵快速幂
trick: 矩阵有变化的矩阵快速幂
简要题意:
有一等差数列,首项为 \(A\),公差为 \(B\),长度为 \(L\)。
现在把这个数列中所有数拼起来(e.g. \(3,7,11,15,19\rightarrow37111519\))。
问拼起来的这个数 \(\bmod M\) 的值。
\(1\le L,A,B \le 10^{18},1\le M\le 10^9\)
题解:
发现这个东西可以递推, 设 \(f_i\) 表示数列, \(g_i\) 表示答案, 写一下 dp:
注意到这个 \(k\) 最多只会变化 \(36\) 次, 因此写一个接很多段的矩阵快速幂优化即可.
14. [ABC131F] Must Be Rectangular!
tag: 二维平面, 并查集
trick: 网格图点转化为行和列的连接
简要题意:
给定平面中 \(N(1\le N\le 10^5)\) 个点 \((x_i,y_i)\ (1\le x_i,y_i\le 10^5)\),你可以不断执行以下操作:如果 \((x_a,y_a),(x_a,y_b),(x_b,y_a)\) 均存在,且 \(x_a\ne x_b\),\(y_a \ne y_b\),\((x_a,y_b)\) 不存在,则加入一个点 \((x_b,y_b)\)。
求最多可以执行多少次这样的操作。
题解:
发现答案的图是多个网格图, 那么不妨认为每一个点 \((x,y)\) 是一个把第 \(x\) 行和第 \(y\) 列绑定的过程, 那么可得最终的点数. 用并查集维护即可.
15. [ABC132F] Small Products
tag: dp
trick: dp优化(数论分块)
简要题意:
求有多少种长度为 \(K\) 的正整数序列,满足相邻元素乘积不超过 \(N\),答案对 \(10^9 + 7\) 取模。
题解:
考虑后面填什么只和上一个数有关, 因此设 \(f_{i,j}=\sum_{k=1}^{\lfloor\frac{N}{j}\rfloor}f_{i-1,k}\), 那么就可以考虑按照下取整分块, 复杂度 \(O(k\sqrt V)\).
16. [ABC135E] Golfs
tag: 二维平面, 构造, 贪心
trick: 构造(极端值), 贪心(极端值)
简要题意:
你现在在 \((0,0)\), 你每次可以去一个离你曼哈顿距离为 \(k\) 的位置, 询问去到 \((x,y)\) 的最少移动次数, 并要求构造方案.
\(1\leq k \leq 10^9,-10^5 \leq x,y \leq 10^5, (x,y)\not=(0,0)\).
题解:
考虑 \(n\) 步能到达的范围, 和 \(n-1\) 步相做差, 实际上是一个方形环. 那么这样的话, 你可以 \(O(1)\) 处理每个点的最短路, 那么由于每个点向上下左右直接移动必然有一个更优, 没有的话就意味着可以直接走到终点. 模拟构造即可.
17. [ABC139F] Engines
tag: 贪心, 向量
trick: 贪心(区间更优)
简要题意:
给定 \(N\) 个向量,选出一些向量使得它们和的模长最大。
求最大的模长.
\(n\leq 100\).
题解:
注意到选择一个区间必然更优, 那么暴力枚举区间即可.
18. [ABC140F] Many Slimes
tag: 贪心
trick: 贪心(极端值)
简要题意:
你有一个史莱姆,你可以给他的健康值设置成任意整数,每个史莱姆每秒必然产生一个健康值严格小于它的史莱姆,这个健康值也由你来指定。
给定大小为 \(2^n\) 的集合 \(S\) ,求是否能够分裂出该集合。
$ 1\ \leq\ N\ \leq\ 18, 1\ \leq\ S_i\ \leq\ 10^9 $.
题解:
首先一开始必然是集合中最大的那个, 然后每次分裂应当分裂出自己能分裂的集合中最大的那个, 这个集合是空集则无解. 用 STL 模拟即可.
19. [ABC141F] Xor Sum 3
tag: 线性基
trick: 拆贡献(整体拆到二进制位), 减少变量
简要题意:
给定 \(n\) 个非负整数,将它们分成两组。记其中一组异或和为 \(a\),令一组异或和为 \(b\),求 \(a+b\) 的最大值。
题解:
首先令 \(s = \bigoplus_{i=1}^nx_i\), 那么任务转化为 \(\text{maximize} ( a+ (s\oplus a))\).
考虑拆位, 对于 \(s\) 有值的位, 对答案的贡献一定是 \(1\); \(s\) 无值的位, 若 \(a\) 有值, 那么对答案的贡献是 \(2\), 反之为 \(0\).
因此任务转化为找到一个子集, 使得它的异或和不考虑 \(s\) 有值的那些位后尽量大. 用线性基维护即可.
20. [ABC143F] Distinct Numbers
tag: 贪心, 构造, 双指针
trick: 枚举可能的答案, 贪心(补偿最小维持较小极差), 对 min 操作分讨拆式子, 前/后缀和优化, 基于单调性的双指针
简要题意:
记 \(i\) 出现了 \(cnt_i\) 次.
我们反过来想, 如果我们只取 \(n\) 次, 那么每次能最多取多少物品? 我们的策略是从 \(1\) 到 \(V\) 考虑每个数, 取出其中 \(\min(n,cnt_i)\) 个, 然后依次放进当时大小最小的容器内. 这样显然保证最大和最小值相差不超过 \(1\) 并最优.
这样, 我们总共放进去的次数是 \(\sum_{i=1}^V\min(cnt_i,n)\). 我们设 \(cnt_p=i\) 出现的次数为 \(ccnt_i\), 那么能放进去的次数 \(p(n) = \sum_{i=1}^V\min(cnt_i,n)=\sum_{i=1}^ni \ ccnt_i+\sum_{i=n+1}^Vn \ ccnt_i\), 这个东西可以用前缀和, 后缀和优化到 \(O(1)\).
我们发现, 如果要放 \(n\) 次, 每次放 \(k\) 个, 那么这组 \((n,k)\) 合法当且仅当 \(f(n)\geq k \ n\), 由于随着 \(k\) 变大, 答案递减, 因此双指针即可线性.
21. [ABC144F] Fork in the Road
tag: 期望, 贪心
trick: 贪心(极端值更优), 枚举方案推期望, 期望概率同时维护, 前后缀同时维护
简要题意:
一个 DAG, 保证每一条边 \((u,v)\) 满足 \(u < v\); 保证任意点可到达 \(n\).
起点是 \(1\) 做随机游走, 你需要在原图中删掉至多一条边, 使得从 \(1\) 到 \(n\) 的期望步数最少.
题解:
sol1:
考虑维护从 \(i\) 为起点, 所有到 \(n\) 路径的期望长度 \(f_i\), 转移显然.
对于每个点, 考虑把 \((u,\argmax_{(u,v)}f_v)\) 这条边删掉, 这样可以最大程度减少 \(f\).
复杂度 \(O(nm)\).
sol2:
考虑维护删掉一条边之后答案的变化量.
从方案入手. 如果一个方案经过了 \((u,v)\), 那么这个方案的贡献要减掉; 如果一个方案经过了 \(u\), 那么它的贡献要修改.
考虑维护 \(f_i\) 表示从 \(1\) 到 \(i\) 的期望路径长度, \(g_i\) 表示从 \(1\) 到 \(i\) 的概率; \(F_i\) 表示从 \(n\) 到 \(i\) 跑反图的期望路径长度, \(G_i\) 表示从 \(n\) 到 \(i\) 跑反图的概率, 上面的东西就能 \(O(1)\) 计算了.
复杂度 \(O(m)\).
22. [ABC145F] Laminate
tag: dp, 贪心
trick: 贪心(极端值), dp(以修改的最后一个位置为状态), 合并等价元素
简要题意:
现在有 \(n\) 个柱子排在一起,每个柱子高度为 \(h_i\), 有至多 \(k\) 次机会任意修改某些柱子的高度. 然后,执行操作:每次可以横向染黑一段连续的柱子。
问最终染黑所有柱子的操作次数至少是多少。
\(1 \leq k \leq n \leq 300\).
题解:
首先不考虑修改, 我们要形式化的表示答案. 对于每一个极大操作区间, 我们不妨把它的贡献放在左端点上: 我们注意到在该高度上左端点有柱子, 而更左边的位置没有. 那么形式化的, \(ans = \sum_{i=1}^n\max(0,a_i-a_{i-1})\) ( 认为 \(a_0=0\) ).
那么一次修改有什么用呢? 我们如果要修改第 \(i\) 个柱子, 那必然意味着这个柱子会被修改到左右中的一个高度, 然而由于答案的贡献只看相邻的差, 这个时候把修改的那根柱子删掉不会影响答案. 因此, 我们把问题转化成了, 从 \(n\) 根柱子中删掉 \(k\) 个, (换句话说, 选择其中的 \(n-k\) 个), 要求最小化答案式子.
这个是好做的, 考虑设 \(f_{i,j}\) 表示从前向后第 \(i\) 个元素 (它必保留), 已经选了 \(j\) 个的最小答案.
23. [ABC149F] Surrounded Nodes
tag: 容斥, 期望
trick: 正难则反, 期望的线性性拆解加减, 拆贡献(期望拆到概率)
简要题意:
给定一棵 \(N\) 个节点的树 \(T\) ,现在要给树上每个节点随机涂色,每个节点有 \(\frac 1 2\) 的概率染成黑色, \(\frac 1 2\) 的概率染成白色。对于一颗染过色的树,定义 \(S\) 为包含树上所有被染成黑色的节点的,节点数最小的连通子图。定义 \(S\) 的价值为 \(S\) 中白色节点的个数。问 \(S\) 的期望价值是多少。答案对 \(10^9+7\) 取模。
\(2\le N \le2\times 10^5, 1\le A_i,B_i\le N\)
题解:
首先考虑这个价值其实就等于导出子图的大小减掉黑点的个数, 根据线性性把它拆掉, 后一半显然是 \(\frac{n}{2}\), 前一半不好计算.
考虑把前一半的贡献拆到每个点上, 变成了每个点是否在导出子图中的概率, 在的话不好求, 但是不在导出子图中的情况只有所有黑点都不在 \(u\) 的子树内和所有黑点都在 \(u\) 的同一颗子树内两种情况.
分别计算概率, 不合法的概率是 \(\frac{2^{n-si_u}+\sum_{(u,v)}(2^{si_v}-1)}{2^n}\). \(-1\) 的原因是空集会被算重.
24. [ABC150E] Change a Little Bit
tag: 组合计数
trick: 顺序无关则可以排序, 贪心(极端值), 钦定计数, 拆贡献(整体拆到元素)
简要题意:
对于两个长度为 \(n\) 的 \(\texttt{01}\) 序列 \(S,T\) ,我们定义 \(f(S,T)\) 为通过以下操作将 \(S\) 修改为 \(T\) 的最小代价和: 选择一个 \(S\) 中的二进制位 \(S_{i}\) ,然后改变 \(S_{i}\) 的 \(\texttt{01}\) 状态,代价为 \(D \times C_{i}\),其中 \(D\) 是此次操作前满足 \(S_{j}\ne T_{j}\) 的整数 \(j\) 的数量,\(C_{i}\) 是一个给定的序列中的一个值。
求当 \(S\) 取 \(2^n\) 种不同的状态,\(T\) 取 \(2^n\) 种不同的状态时,\(f(S,T)\) 的和对 \(1000000007\) 取模的结果。
$1 \le n \le 200000 , 1 \le C_{i} \le 10^9 $
题解:
首先发现元素给出的顺序不影响答案, 直接把 \(C\) 升序排序.
然后发现最右策略必然是从左向右调整 \(S\), 因此考虑拆贡献, 枚举目前在改哪个位置, 然后发现 \(D\) 的值就是后面的不一样的个数, 再枚举即可.
\(ans = \sum_{i=1}^n2\times 4^{i-1}\ 2^{n-i}\sum_{j=1}^{n-i} (j+1)\binom{n-i}{j}\)
用组合数恒等式优化即可.
25. [ABC150F] Xor Shift
tag: 异或, 哈希
trick: 枚举可能的答案, 异或的自反性, 类似的东西放在一起, 哈希(串相等)
简要题意:
给定两个长度为 \(n\) 的序列 \(a=\{a_0,a_1,\cdots,a_{n-1}\}\) 和 \(b=\{b_0,b_1,\cdots,b_{n-1}\}\),输出所有有序数对 \((k,x)\) ,满足:
- \(0\leq k<n\) 且 \(x\geq 0\)。
- 序列 \(a'=b\),其中 \(a'_i = a_{i+k\bmod n}\operatorname{xor} x\ (0\leq i<n)\),“\(\operatorname{xor}\)”表示按位异或。
\(1\leq n\leq 2\times 10^5\),\(0\leq a_i,b_i<2^{30}\)
题解:
首先考虑枚举 \(k\).
这样的话, 我们有对于 \(i\in[0,n)\), 有 \(a_i\operatorname{xor} b_{i + k \bmod n} = a_{i+1} \operatorname{xor} b_{i+k+1\bmod n}\).
考虑把 \(a\) 放在一边, \(b\) 放在另一边, 那么就有 : \(a_i\operatorname{xor}a_{i+1}=b_{i + k \bmod n}\operatorname{xor} b_{i+k+1\bmod n}\)
实际上, 如果把这二者视为字符串, 那么就有两个串相等, 用哈希去比较即可.
26. [ABC151F] Enclose All
tag: 计算几何, 最小圆覆盖
trick: 枚举可能的答案
简要题意:
给定一些坐标系上的点,求最小的可以把所有点都覆盖的圆的半径.
\(n \leq 50\).
题解:
首先, 答案的圆上至少有两个关键点, 如果恰好有两个的话这两个点的连线就是直径.
枚举即可.
27. [ABC152F] Tree and Constraints
tag: 容斥, 状态压缩
trick: 用二进制处理并, 二项式反演容斥
简要题意:
给定一棵 \(n\) 个点的树和 \(m\) 条路径,求有多少种对树边染黑白两色的方案使得每条路径都有至少一条黑边。
\(n\leq 50, m \leq 20.\)
题解:
考虑二项式反演, 对于路径集合 \(S\) , 对于它们路径的并上面的 \(k\) 个点, 钦定它们为白色, 剩下的随便即可.
问题转化为如何求 \(S\) 的并的大小. 实际上, 由于点数不多, 只需要预处理出每条链所含点对应的二进制表示, 然后递推即可.
复杂度 \(O(nm+2^m)\).
28. [ABC153F] Silver Fox vs Monster
tag: 贪心
trick: 贪心(极端值)
简要题意:
\(Silver\ Fox\) 在打怪。他的面前有 \(N\) 只怪。
这 \(N\) 只怪站在一行上。为了方便,我们把他们看作在一个数轴上。其中第 \(i\) 只怪物的坐标为 \(X_i\) ,有 \(H_i\) 点血量。
他可以用炸弹来攻击这些怪物。如果选择在位置 \(x\) 投放炸弹,那么坐标位于 \(x-D\) 和 \(x+D\) 之间的怪物会全部减少 \(A\) 点血量。
如果所有怪物的血量都 \(\le 0\),那么他就获胜了。
找到在获胜的情况下,\(Silver\ Fox\) 需要投放的炸弹最少有多少个。
题解:
由于最右边的怪物不能不打, 那么在 \(\max X_i - D\) 的位置投放炸弹最优. 模拟即可.
29. [ABC154E] Almost Everywhere Zero
tag: dp
trick: dp(按数位从前向后)
简要题意:
给定两个正整数 \(N,K\),求出 \(1\) 到 \(N\) 中有多少个正整数,满足它的非零数位个数和恰好等于 \(K\)。
题解:
采用记忆化搜索, 设 \(f_{i,j}\) 表示前 \(i\) 位已经填完, 有 \(j\) 个非零位, 后面的任意填的合法方案数.
30. [ABC154F] Many Many Paths
tag: 组合计数
trick: 询问差分到前缀
简要题意:
给定 \(a,b,c,d\) , 求 \(\sum_{i=a}^b\sum_{j=c}^d\binom{i+j}{i}\)
题解:
询问差分到前缀, 前缀求值推式子即可.
31. [ABC156E] Roaming
tag: 组合计数
trick: 答案在上下界内任取, 变更主元
简要题意:
有 \(n\) 不同个房间,每个房间有 \(1\) 个人。人可以在各个房间中移动(不能原地移动)。所有人一共移动了 \(k\) 次,问最后各个房间人数排列有多少种情况。
$ 3\ \leq\ n\ \leq\ 2\ \times\ 10^5, 2\ \leq\ k\ \leq\ 10^9 $
题解:
答案中空房间的数量在 \([k,n-1]\) 之间, 并且这和合法是充要的.
因此枚举有多少个空房间, 然后插板就可以了.
32. [ABC156F] Modularness
tag: 进制, 容斥
trick: 取模转化为进制, 有进制考虑进位
简要题意:
有一个长度为 \(k\) 的序列 \(d_0,d_1,\ldots,d_{k-1}\)。
有 \(q\) 组询问,每组询问给出三个数 \(n,x, m\), 同时定义长度为 \(n\) 的序列\(a_0,a_1,\ldots,a_{n-1}\),其中:
对于每组询问,请回答有多少个 \(j\) 满足 \(0\leq j< n-1\) 且 \((a_j\mod m)<(a_{j+1}\mod m)\)。
数据范围:\(1\leq k,q\leq 5000,0\leq d_i,x\leq 10^9,2\leq n,m\leq 10^9\),所有的数均为整数。
题解:
首先考虑把所有的 \(d_i\) 都对 \(m\) 取模.
这之后, 发现所有的 \((a_j\mod m)=(a_{j+1}\mod m)\) 意味着 \(d_i = 0\), 而所有的 \((a_j\mod m)>(a_{j+1}\mod m)\) 意味着在 \(m\) 进制下有进位. 而每次进位必然是 \(1\), 因此总共的进位, 也就是总和右移一位的值就是这部分的贡献.
33. [ABC158E] Divisible Substring
tag: 质数
trick: 分讨掉特殊质数
简要题意:
给定一个质数 \(P\) 和一个字符串 \(s\)。
问有多少个 \(s\) 的子串 \(t\) 满足:将 \(t\) 视为十进制整数后,这个数是 \(P\) 的倍数。
$ 1\ \leq\ n\ \leq\ 2\ \times\ 10^5 $.
题解:
合法当且仅当 \(\frac{sum_r-sum_l}{10^{r-l}}\equiv 0 \mod P\), 如果 \(P\not=2,P\not=5\), 那么除以几个 \(10\) 不会影响是否能被 \(P\) 整除, 因此相同的可以两两组合,.
\(P=2\) 或 \(P=5\) 用最后一位数的特点即可.
34. [ABC158F] Removing Robots
tag: dp, 单调栈
trick: 有单调性端点的区间最值用单调栈/单调队列, dp优化(单调队列)
简要题意:
\(N\) 个机器人,第 \(i\) 个机器人在\(X_i\)位置上,若一个机器人被激活,则它将向右移动 \(D_i\),若途径别的机器人,则该机器人也将被激活,求可以得到多少个没被激活的机器人的集合(指定一个集合开始时同时激活, 激活个数不限)(对998244353取模)。
题解:
考虑 dp, 设 \(nxt_i\) 表示激活 \(i\) 后后方第一个未激活的位置, \(f_i\) 表示后 \(i\) 个位置的方案数, 则有:
第一个转移最值查询区间左右端点均有单调性, 用单调栈即可.
35. [ABC160F] Distributing Integers
tag: dp
trick: 树的拓扑排序计数, dp(换根)
简要题意:
求以树的每一个点为起点的拓扑排序计数.
题解:
由公式 \(ans = \frac{n!}{\prod_usi_u}\), 换根 dp 即可.
36. [ABC024D] 動的計画法
tag: 组合数学
trick: 写出通项, 组合数相邻项的比例关系
简要题意:
现有一个表格, 该表格由下面的公式生成:
-
对任意 \(i \geq 0\), \(a_{i,0} = a_{0,i} = 1\).
-
对任意 $i,j> 0 $ , \(a_{i,j} = a_{i-1,j} +a_{i,j-1}\).
给出 \(a_{i,j},a_{i+1,j},a_{i,j+1}\), 求解 \(i,j\).
题解:
观察可得, \(f_{i,j} = \binom{i+j}{i}\).
也就是说, 现在 \(\binom{i+j}{i}=p,\binom{i+j+1}{i+1}=q,\binom{i+j+1}{i}=r\), 求解 \(i,j\).
考虑展开组合数, \(q=\binom{i+j+1}{i+1}=\frac{i+1}{i+j+1}\binom{i+j}{i}=\frac{i+1}{i+j+1}p\), 类似的, \(r=\frac{j+1}{i+j+1}p\), 这是一个关于 \(i,j\) 的二元方程组, 解出来即可.
37. [ABC161F] Division or Subtraction
tag: 因数
trick: 根号分治
简要题意:
给定正整数 \(n\)。问 \(2,3,\cdots,n\) 中有多少个 \(k\) 满足如下条件:
如果 \(k|n\),那么令 \(n\) 的值除以 \(k\),否则令 \(n\) 的值减少 \(k\),如此操作若干次后能得到 \(1\)。
\(2\le n\le10^{12}\)
题解:
考虑这个过程, 那么一定有 \(n = k^p(xk+1)\).
考虑根号分治. 对于 \(k > \sqrt n\), 则有 \(p = 0\) 或者 \(p = 1,x = 0\). 后者意味着 \(k=n\); 前者意味着 \(k\mid n - 1\).
对于 \(k \leq \sqrt n\), 暴力跑即可.
38. [ABC163E] Active Infants
tag: 区间dp
trick: 决策区间的一端考虑区间 dp, 变更主元.
简要题意:
给定 \(n\) 个数,现在要将其重排。
如果 \(a_i\) 于重排前在第 \(i\) 个位置,现在移动到了第 \(j\) 个位置,那么对答案的贡献就是 \(|j-i|×a_i\) 。
现在,你需要让答案尽可能大。
$ 2\ \leq\ n\ \leq\ 2000 $
题解:
考虑已经决策完了一些数, 此时的最佳决策一定是把剩下的数决策到剩余位置的一端, 那么归纳法即得剩余位置是一个区间.
另外可以发现反过来, 如果我们钦定 \([l,r]\) 是空的, 那么我们也知道哪些元素已经填了, 哪些没有填. (当然就是最小的那 \(r-l+1\) 个没有填).
我们设 \(f_{l,r}\) 表示 \([l,r]\) 还空着, 剩下的等待决策的最大答案, 我们决策最大的那个到左右两边做转移即可.
39. [ABC164E] Two Currencies
tag: 分层图, 最短路
trick: 用一个属性建立分层图.
简要题意:
有 \(n\) 个城市,它们由 \(m\) 条双向道路连接,保证它们能够彼此到达。第 \(i\) 条道路连接 \(u_i,v_i\),需要花费 \(x_i\) 个银币,耗费 \(t_i\) 秒的时间。每个城市处都有兑换银币处,第 \(i\) 个城市中你可以用 \(1\) 个金币兑换 \(c_i\) 个银币,可以兑换无限次,不过兑换 \(1\) 次需要花费 \(d_i\) 秒的时间。你一开始在 \(1\) 号城市,有 \(s\) 个银币和无限多的金币,求到其它城市需要耗费的最小时间。
\(1 \leq n \leq 50\),\(n - 1 \le m \le 100\),\(1 \leq x_i \leq 50\),\(1 \leq t_i,d_i \leq 10^9\),\(1 \leq s,c_i \leq 10^9\).
题解:
发现数据范围很小, 那么只需要把每个点按照剩余钱数拆点, 就可以直接模拟跑最短路了.
40. [ABC165F] LIS on Tree
tag: LIS, dfs
trick: 用dfs来维护父链信息.
简要题意:
给您一棵\(n\)个节点的树,树的每个节点上都有一个值\(a_i\)。现在要您求出从\(1\)号点到\(i\)号点的路径上最长上升子序列的长度。
\(2\le n\le 2e5,a_i\le 1e9, u\le n,v\le n,u\neq v\)
题解:
考虑朴素的 dp, 则有 \(f_u=\max_{v \in fa_u \wedge a_v < a_u}f_v + 1\).
发现转移来源是父链, 那么用 dfs 搜索回溯即可.
41. [ABC167F] Bracket Sequencing
tag: 贪心
trick: 用左右富裕的括号数表示一个括号串, 贪心(括号串提前抵消).
简要题意:
第一行给出一个 \(n\) 表示有 \(n\) 个只含有 \(\texttt{(,)}\) 的括号序列。(\(1\le n\le 10^6\))
之后 \(n\) 行,每行一个括号序列。
如果可以通过排列这 \(n\) 个括号序列使得其成为一个合法括号序列(即左右括号一一匹配),输出 \(\text{Yes}\);如果不能,输出 \(\text{No}\)。
题解:
考虑把每一个括号表示为一个 \((l,r)\) 表示左右不能匹配括号数, 那么有结论: \(r< l\) 的放在左边, 并且按照 \(l\) 升序; \(r > l\) 的放在右边, 并且按照 \(r\) 降序.
42. [ABC170F] Pond Skater
tag: bfs
trick: 最优性剪枝/保证枚举合法保证复杂度
简要题意:
有一个 \((H+1)\) 行 \(W\) 列的矩阵,你每步可以在矩阵中向右或向下移动一个格子。其中,在第 \(i\,(1 \le i \le H)\) 行中,你无法从左至右第 \(A_i\) 至 \(B_i\) 个格子向下走。对于每一个 \(k\,(1 \le k \le H)\),求出你从第 \(1\) 行的任意一个格子出发移动到第 \((k+1)\) 行的最少步数,若无法移动到则输出 -1
。
\(1 \le H,W \le 2\times 10^5\),\(1 \le A_i \le B_i \le W\)。
题解:
考虑暴力 bfs.
但是当在一个方向扫到一个距离和自己一样大, 甚至更小的节点时放弃扫描这个方向, 因为从那个节点往后面走会更优.
画图就能发现每个节点只会被扫描到两边, 复杂度正确.
43. [ABC172F] Unfair Nim
tag: 位运算, 异或, NIM游戏
trick: 加法拆解为位运算, 运算形式统一.
简要题意:
有 \(N\) 堆石子,第 \(i\) 堆石子有 \(A_i\) 个。
两人进行取石子游戏,两人轮流操作,每人每次可以从任意一堆中取出任意数量石子,当有一方无法取出任何石子时,该方告负。
在游戏开始前,从第 \(1\) 堆中取出一些石子放到第 \(2\) 堆(可以不取,但不能全取)来构造一个后手必胜的局面。
求出最少要从第一堆取多少放到第二堆。若无解,输出 -1
。
题解:
其实题面转化后如下:
给定 \(p,q,a\), 请你构造一组 \(A,B\), 使得 \(A\) 最大:
发现既有加法又有位运算, 这形式很差, 考虑拆解加法:
求出 \(A \operatorname{and}B\) 后, 从高到低每一位贪心就可以了.
44. [ABC174F] Range Set Query
tag: 二位偏序
trick: 数颜色转化为上一次出现.
简要题意:
静态区间数颜色.
题解略.
45. [ABC177F] I hate Shortest Path Problem
tag: 贪心, dp
trick: 贪心(极端值), dp优化(贪心).
简要题意:
我们先介绍贪心策略:
这个路径在该处向右当且仅当这个节点不能向下.(注意那个仅当很重要.)
这样我们就可以简化很多转移, 而且不会丢掉任何的有用的解, 用 STL 模拟 dp 即可.
46. [ABC182F] Valid payments
tag: dp, 进制
trick: dp(按数位从前向后), 倍数关系考虑进制, 有进制考虑进位.
简要题意:
有 \(N\) 种硬币,面值分别为 \(A_1,A_2,A_3 \dots A_N\) 元,满足 \(A_1=1\),且对于所有 \(1 \le i < N\),有 \(A_i<A_{i+1}\) 且 \(A_i|A_{i+1}\) 。
lunlun 用 \(y(\ge X)\) 元 买了一件 \(X\) 元的商品,收到了 \(y-X\) 的找零。lunlun 和收银员都用了最少数量的硬币来付钱。特殊地,收银员没有和 lunlun 用相同种类的硬币。
给出 \(X\),求 \(y\) 有多少种可能。
\(N \leq 50.\)
题解:
考虑有 \((y-X)+X=y\), 由于 \(A_i\) 是以倍数关系递增的, 不妨看作进制, 去填 \(y-X\) 的每一位的数.
由于 \(X\) 是确定的, 那么可以预处理它的每一位填了多少, 这样的话就只需要关注另一个加数了.
由于 \(y\) 和 \(y-X\) 每一位至少有一个是 \(0\), 那么如果选择进位, 那么 \(y-X\) 该位只能填恰好进位的数, 而否则的话只能填 \(0\).
这一切与上一位是否进位有关, 因此设 \(f_{i,0/1}\) 表示考虑前 \(i\) 位, 最后一位是否有进位.
转移如下:
若上述条件不成立, 则若上一位进位了这一位不论填什么1都会进位.
若上述条件不成立, 这一位填什么都不会进位.
47. [ABC187F] Close Group
tag: dp, 状态压缩
trick: dp(状态压缩), 子集枚举.
简要题意:
给定一个 \(n\) 个节点 \(m\) 条边的无向图,要求通过删去若干条边(可以不删),使得每个连通块都是完全图。求最少分成多少个连通块。
\(n \leq 18\).
题解:
预处理出每一个集合是否能作为一个完全图, 然后设计状压 dp 子集枚举转移即可.
48. [ABC189F] Sugoroku2
tag: dp
trick: dp维护式子系数.
简要题意:
有一个人想从 \(0\) 号格子走到 \(N\) 号格子,每轮等概率从 \([1, M]\) 中选择一个正整数 \(x\),从当前位置 \(i\) 到位置 \(i + x\),当前位置大于等于 \(N\) 则游戏结束,有 \(K\) 个特殊位置,到特殊位置会直接传送回位置 \(0\)(不算轮数),问期望轮数。
\(1 \le N, M \le 10^5\)
\(0 \le K \le 10\)
题解:
考虑特殊点的 dp 值必然是 \(f_1\), 而 \(f_1\) 还不知道, 没有办法做转移.
因此考虑每一个 \(f_i\) 维护一个关于 \(f_1\) 的一次函数, 在 \(f_1\) 处列方程解出来即可.
注意判断无解.
49. [ABC191D] Circle Lattice Points
tag: 计算几何
trick: 枚举可能的答案.
简要题意:
在二维平面上有一个以中心点 \((X,Y)\),半径 \(R\) 的圆。请计算出在圆内或圆周上的格点的个数。
题解:
枚举横坐标即可.
50. [ABC191F] GCD or MIN
tag: 约数
trick: 枚举可能的答案, 神秘复杂度(约数).
简要题意:
有 \(n\) 个整数,你每次可以将其中两个数 \(x,y\) 去掉,并添上 \(\gcd(x,y)\) 或 \(\min(x,y)\)。问最后剩下的一个数有多少种可能的取值。
$ 2\ \le\ N\ \le\ 2000 , 1\ \le\ A_i\ \le\ 10^9 $
题解:
不难发现答案满足下面的性质:
暴力枚举每个数的因数, 然后检验即可.
51. [ABC193E] Oversleeping
tag: exgcd
trick: 枚举可能的答案, 变更主元.
简要题意:
一个人坐公交从 \(A\) 站坐到 \(B\) 站,公交车先用 \(x\) 秒到 \(B\) 站,然后在 \(B\) 站停 \(y\) 秒,再用 \(x\) 秒到 \(A\) 站,再在 \(A\) 站停 \(y\) 秒,如此循环往复。而这个人先睡眠 \(p\) 秒,再醒来 \(q\) 秒,如此循环往复。求这个人最早何时能在 \(B\) 站下车,若永远不能,输出 \(infinity\)。
$ 1\ <\ = Y\ <\ =\ 500 , 1\ <\ = Q\ <\ =\ 500 $
题解:
列出式子, 发现一个合法的 \(ans\) 满足下面的条件:
注意到这些都可以用模意义下的一个区间描述, 但是没有办法解.
考虑这两个区间都很小, 可以枚答案到底在区间的哪个位置求解, 复杂度 \(O(yq\log V)\).
其实仍然可以优化, 考虑原方程类似于:
考虑直接枚举 \(n-q\) 的值, 这样也可以求解, 复杂度 \(O((y+q)\log V)\).
52. [ABC194F] Digits Paradise in Hexadecimal
tag: dp
trick: dp(按数位从前向后), 填数不区分是什么数只关心个数无需状压.
简要题意:
给你一个长度为 \(2 \times 10^5\) 的 \(16\) 进制字符串 \(N\),让你求出在 \([1,N]\) 中所有的 \(16\) 进制数,有多少满足刚好有 \(K\) 个不同的数位(不包含前导 \(0\)).
题解:
考虑设 \(f_{i,j}\) 表示已经填了 \(i\) 个数, 当前填了 \(j\) 个不同的数的方案数, (不考虑前导零和上界), 爆搜即可.
转移时不需要考虑填的是什么, 只要考虑填的东西之前填没填过即可.
53. [ABC195F] Coprime Present
tag: 质数
trick: dp(状态压缩), 相近的数gcd不大.
简要题意:
你可以从 \([A, B]\) 中的所有正整数中挑选若干个数组成一个集合,问有多少个集合满足集合中的数两两之间互质,集合大小可以为 \(0\) 或 \(1\),此时也记录答案。
\(1 \le A \le B \le 10^{18}\)
\(B - A \le 72\)
\(A, B\) 均为整数
题解:
考虑任意两数间共有的因数不会超过 \(72\), 这下面的质数有 \(20\) 个, 考虑直接作状压即可.
54. [ABC197F] Construct a Palindrome
tag: 图论
trick: 约束与两边有关系考虑双向搜索.
简要题意:
有一个 \(N\) 个点,\(M\) 条边的无向联通图(图可能不是简单的,意味着可能有环)。第 \(i\) 条边连接着点 \(A_i\) 和 \(B_i\),上面有个英文小写字母 \(C_i\)。一条从点 \(1\) 开始,点 \(N\) 结束的回文路径满足:在路径上的边顺次取出字母(也就是取出 \(C_i\)),最后形成的字符串回文(注意:这并不是简单路径,可能会经过重复的点或边)。求从 \(1\) 开始 \(N\) 结束的最短回文路径长度。
$ 2\ \le\ N\ \le\ 1000 , 1\ \le\ M\ \le\ 1000 $
题解:
要求路径回文, 换句话说, 前面和后面的一样.
因此考虑设状态 \((u,v)\) 表示从前面搜到了 \(u\), 从后面搜到了 \(v\) 的最小步数, 双向 bfs 即可.
55. [ABC199F] Graph Smoothing
tag: 期望, 矩阵快速幂优化dp
trick:拆贡献(多步后的期望拆到每一步), dp优化(矩阵快速幂).
简要题意:
给定一张 \(n\) 个点 \(m\) 条边的无向图,节点从 \(1\sim n\) 编号,每个节点 \(i\) 都有点权 \(a_i\)。接下来要进行如下操作:
- 从 \(m\) 条边中等概率地选择一条,将其两个端点 \(u,v\) 的点权 \(a_u,a_v\) 修改为他们的算术平均值 \(\dfrac{a_u+a_v}2\)。
求 \(k\) 次操作后每个点点权的期望。
\(n \leq 100,k \leq 10^9\)
题解:
设 \(f_{i,j}\) 表示 \(j\) 步操作后 \(w_i\) 的期望.
发现 \(j+1\) 的过程中, 转移可以用矩阵刻画, 因此用矩阵快速幂即可.
56. [ABC200E] Patisserie ABC 2
tag: 二分
trick: 二分答案, 写出通项.
简要题意:
现有全集 \(U = [1,n] \cap \mathbb Z\), 构造目标集合 \(P = U * U * U\), 将这 \(n^3\) 个元素按如下规则排序:
- 三维之和升序;
- 若相等, 第一维升序;
- 若相等, 第二维升序.
求排序后的第 \(k\) 个元素是什么.
题解:
考虑每个指标之下的元素个数有单调性, 二分答案计算即可.
57. [ABC203F] Weed
tag: dp
trick: 值域定义域互换, 除法次数为 \(\log V\).
简要题意:
有 \(n\) 株草,第 \(i\) 株的高度为 \(a_i\),你可以预先拔掉不超过 \(k\) 株草,然后按如下方式操作:
- 选取没拔掉的草中最高的草(高度 \(h\)),一次拔掉所有高度 \(>\lfloor \frac{h}{2}⌋\) 的草。
你需要在操作次数最少的情况下,最小化预先拔掉的草的数量。
\(1 \leq k \leq n \leq 2 \times 10 ^ 5\).
题解:
考虑从后向前dp:
设 \(f_{i,j}\) 表示考虑后 \(i\) 个, 提前拔 \(j\) 次草的最小操作数.
但是注意到值域的大小是 \(\log V\), 那么交换一维定义域即可.
58. [ABC204F] Hanjo 2
tag: dp, 状态压缩
trick: dp(状态压缩), dp优化(矩阵快速幂), 自身是否被占领作为状态.
简要题意:
有一个宽\(H\)(\(1≤H≤6\)),长\(W\)(\(1≤W≤10^{12}\))的房间,现在用两种地板砖铺地板:长2,宽1的长方形地板砖和边长为1的正方形地板砖.
长方形地板砖可以旋转成长1,宽2的长方形地板砖.
求有多少种方法可以铺满这个房间.
题解:
考虑dp, 但是一列铺完之后, 下一列会有突起不能再铺, 这个也只能状压塞到状态里, 横向的递推矩阵快速幂即可.
59. [ABC205E] White and Black Balls
tag: 组合计数
trick: 过程中有线性约束考虑反射容斥.
简要题意:
给出 \(n\) 个白球,\(m\) 个黑球及一个常数 \(k\),问有多少种排列使得 \(\forall i\in[1,n+m],w_i\le b_i+k\),其中 \(w_i\) 表示在排列的第 \(i\) 个球以及它之前的白球个数,\(b_i\) 表示在排列的第 \(i\) 个球以及它之前的黑球个数。
题解:
考虑建模到二维平面, 初始在 \((0,0)\), 加入一个白球就向上走一格, 遇到一个黑球就向右走一格, 不能碰到 \(y=x+k+1\) 走到 \((n,m)\) 的方案数, 用反射容斥算一下就行.
60. [ABC205F] Grid and Tokens
tag: 网络流
trick: 最大流刻画有约束的匹配问题, 网格图点转化为行和列的连接, 有容量限制的点考虑拆点, 查询可以放在行列点的中间而非两边.
简要题意:
你有一个 \(H\) 行 \(W\) 列的方格,通过 \((r,c)\) 表示第 \(r\) 行第 \(c\) 列的单元格。
你又有 \(n\) 枚棋子,对第 \(i\) 枚棋子,你可以选择以下一个操作:
- 将这枚棋子放在 \((r,c)\),满足 \(A_i \le r \le C_i, B_i \le c \le D_i\)
- 跳过这枚棋子,即不放到棋盘上并处理下一枚棋子。
我们不允许最后在某一行或某一列上有超过一枚棋子。在此条件下,你最多可以放多少枚棋子?
\(H,W \leq 100\).
题解:
考虑网络流建图, 从源点连向所有行, 从行连向每个矩阵的入点, 再从入点连向各自的出点, 再连向列的点, 最后连汇点.
61. [ABC206F] Interval Game 2
tag: 博弈论, dp
trick: 变更主元, 区间从中间断开考虑区间 dp.
简要题意:
有 \(N\) 个左闭右开的区间 \([L_i,R_i)(1\leq i\leq N)\),Alice 和 Bob 用它们玩一个游戏:
-
Alice 和 Bob 轮流做如下的操作,Alice 先来。
-
从 \(N\) 个区间中选择一个区间,这个区间与之前选中的区间不能有重叠部分。
如果某玩家无法再选了,则他算输,另一个人算赢。如果 Alice 和 Bob 采用最佳策略,谁会赢?
\(N \leq 10^5\).
题解:
考虑选择一个区间之后就会断开, 中间的不能选, 那么考虑区间 dp 转移 sg 函数即可.
62. [ABC207D] Congruence Points
tag: 计算几何, 哈希
trick: 哈希(几何图形).
简要题意:
给定坐标轴上两个点集, 判断两个点集形成的图形是否全等.
题解:
考虑哈希, 直接通过每个点集内部两两之间的距离这个东西做哈希即可, 正确性考虑证明一系列全等即可.
63. [ABC207F] Tree Patrolling
tag: dp
trick: 自身是否被占领作为状态.
简要题意:
给出一棵有 \(n\) 个节点的树,每个点可能有一个警卫,每个警卫控制当前节点以及相邻节点。
对每个 \(k=0,1,2,\cdots n\) 求出正好有 \(k\) 个节点被控制的方案数。
答案对 \(10^9+7\) 取模。
\(n\le 2000\)
题解:
设 \(f_{x,k,0/1,0/1}\) 表示 \(x\) 子树内选了 \(k\) 个, \(x\) 自己选没选, \(x\) 是否被占领的方案数, 转移即可.
64. [ABC208E] Digit Products
tag: dp
trick: dp(按数位从前向后), 状态不太多.
简要题意:
求有多少个不大于 \(N\) 的正整数,使得该正整数各位乘积不大于 \(K\)。
\(N \le 10^{18},K \le 10^9\)
题解:
考虑数位 dp, 设 \(f_{i,j}\) 表示填完了前 \(i\) 位, 乘积是 \(j\) 的方案数. 第二维值域很大, 但是有值的位置不会很多, 用 map 即可.
65. [ABC209E] Shiritori
tag: 博弈论, 哈希
trick: 建图刻画博弈, 拓扑排序和一败则胜原则递推可平局博弈结果, 哈希(串相等).
简要题意:
给定 \(N\) 个单词,Takahashi 和 Aoki 二人使用这 \(N\) 个单词进行成语接龙,二者轮流说出单词,接龙的规则如下:
- Takahashi 先手, Aoki 后手;
- 当一个人说出单词后,另一个人必须选择一个单词满足:前一个人说的单词的后三个字母等于此单词的前三个字母,并说出它,如果这个人没有合法的单词可以说出,他输了;
- 单词可以重复使用,区分大小写。
请你输出先手 Takahashi 从第 \(i\ (1\le i\le N)\) 个单词开始说的情况下,且二者都绝顶聪明,游戏的胜负情况。若先手必胜输出 Takahashi
,后手必胜输出 Aoki
,平局输出 Draw
。
\(n \leq 2 \times 10 ^ 5\).
题解:
首先建图, 比较字符串可以用哈希去优化, 然后考虑去递推 sg 函数, 考虑后面的点有一个必败态前面就必胜; 后面的全部必胜前面就必败, 用这两个原则递推即可, 没有推到的位置就是平局.
66. [ABC209F] Deforestation
tag: dp
trick: 与相邻项有关考虑相临项性质, 对元素顺序有要求考虑插入dp, 变更主元, dp转移顺序(值从小到大).
简要题意:
\(n\) 个数:\(a_1,a_2,...,a_n\)。
每次可以选择一个 \(i\),选择的代价是 \(a_{i-1}+a_i+a_{i+1}\),然后令 \(a_i=0\)。
求有多少种方案,使得 \(a_1,a_2,...,a_n\) 都变为 \(0\) 的总代价最小。特别的,\(a_0=a_{n+1}=0\)。
$ 1\ \leq\ N \ \leq \ 4000 $.
题解:
考虑相临项先操作谁更优, 列列式子会发现 \(a_i < a_{i + 1}\) 会先选 \(i+1\), 反之亦然.
考虑选择元素组成的排列, 约束相当于一些 \(i\) 必须在 \(i + 1\) 的前面/后面, 那么考虑插入 dp, 考虑从值域上从小到大填, 设 \(f_{i,j}\) 表示已经填了 \(i\) 个数, 上一个数在当前操作序列中位于第 \(j\) 个的方案数, 转移即可.
67. [ABC211F] Rectilinear Polygons
tag: 扫描线
trick: /.
简要题意:
给出平面的 \(N\) 个简单多边形,对于每个多边形,其每一条边都平行于 \(X\) 轴或 \(Y\) 轴,每一个角都为 \(90\) 度或 \(270\) 度,如图所示。
现在有 \(Q\) 次询问,每次给出一个有序整数对 \((X,Y)\) ,求点 \((X+0.5,Y+0.5)\) 被多少个多边形覆盖。
题解略.
68. [ABC212F] Greedy Takahashi
tag: 倍增
trick: 前途唯一条件单调可以倍增.
简要题意:
有 \(n\) 座城市和 \(m\) 辆公交车,第 \(i\) 辆公交车会在 \(S_i+0.5\) 时从城市 \(A_i\) 出发,在 \(T_i+0.5\) 时到达城市 \(B_i\)。
Takahashi 想要在这些城市中旅行。具体的说,当他在 \(t\) 时刻时位于城市 \(p\) 时,他会按照如下方案移动:
若存在在 \(t\) 时刻后从城市 \(p\) 出发的公交车,那么选择其中离 \(t\) 时刻最近的一辆并乘坐。否则停留在城市 \(p\) 不移动。
现在 Takahashi 想要问你 \(Q\) 个问题,每个问题的格式如下:
如果 Takahashi 在 \(X\) 时刻从城市 \(Y\) 出发,那么 \(Z\) 时刻时 Takahashi 位于哪辆公交车上或者哪个城市中?
题解:
预处理出原图, 是一个dag, 倍增跳即可.
69. [ABC212G] Power Pair
tag: 原根, 质数, 欧拉函数
trick: \([1,P-1]\) 中任何一个数都可以用 \(g^k\) 唯一表示, 神秘复杂度(约数).
简要题意:
给定质数 \(P\),求有多少个整数 \(x,y\),满足
-
\(0\le x,y\le P-1\)
-
\(\exist n\in \mathbb{N},x^n\equiv y\pmod P\)
题解:
首先把 \(0\) 特判掉, 只有 \(1\) 种方案. 然后考虑 \([1,P-1]\) 中任何一个数都可以用 \(g^k\) 唯一表示, 那么只要枚举 \(k\) 即可.
原式转化为:
到这就差不多了, 复杂度 \(O(\sum_{d|n}\sqrt d)\), 跑得飞快.
70. [ABC215G] Colorful Candies 2
tag: 组合数学
trick: 正难则反, 相加有保证不同的只有根号, 拆贡献(期望拆到概率).
简要题意:
现在有 \(n\) 个糖果, 每个糖果有一种颜色 \(c_i\).
现在高桥君想要在中间选 \(k\) 个糖果. 由于他想吃最多种颜色的糖果, 所以他的快乐值是选择的糖果的颜色种类数.
例如, 选择糖果的颜色是 \(\{2,3,3\}\), 那么他的快乐值是 \(2\).
对于 \(\forall k \in [1,n]\), 求出高桥君随机选择 \(k\) 个糖果的快乐值的期望值, 对 \(998244353\) 取模.
\(n \le 5 \times 10^4\), \(c_i \le 10^9\).
题解:
考虑把期望拆掉, 拆成每个元素有贡献的概率, 有贡献的概率不好算, 但是能算没有概率的.
答案形如 \(ans = V - \frac{\sum_{i=0}^V\binom{n-cnt_i}{k}}{\binom{n}{k}}\). 暴力算是不行的, 但是发现 \(cnt\) 一样的颜色是等价的, 可以一起算, 因此转化成 \(V - \frac{\sum_{i=0}^n ccnt_i\binom{n-i}{k}}{\binom{n}{k}}\), 而不同的 \(cnt\) 只有根号个, 这个暴力做就行了, 复杂度 \(O(n\sqrt n)\).
71. [ABC216G] 01Sequence
tag: 差分约束
trick: 遇到对前缀和的约束时考虑差分约束.
简要题意:
你需要构造出一个长度为 \(n\) 的 \(01\) 序列,满足 \(m\) 个限制 \((l_i,r_i,x_i)\):在 \([l_i,r_i]\) 这段区间内,序列上 \(1\) 的个数不小于 \(x_i\)。你需要保证你的方案中包含 \(1\) 的个数最小。
数据保证有解。
\(1 \le n,m \le 2 \times 10^5\)
题解:
考虑把差分约束图建出来, 然后跑拓扑 dp 即可.
72. [ABC217F] Make Pair
tag: dp
trick: 遇到消掉后左右靠拢考虑枚举右端点和谁匹配作区间 dp.
简要题意:
一共 \(2N\) 个学生站成一排,其中有 \(M\) 对朋友关系。老师每次从队列中挑出两个相邻的学生作为同桌。为了关系和睦,每次选出的两个学生必须是朋友关系。选出的两个学生离开队列,空出来的位置左右合拢。
请问老师有多少种方式选完所有学生?对于两种选人的方案,即使同桌关系相同,只要离开队列的顺序不同,也算是不同的方案。
\(N \leq 200\).
题解:
考虑做区间 dp, 对于区间 \([l,r]\), 枚举右端点的匹配点 \(k\), 那么要求 \([k+1,r-1]\) 先合并, \(r,k\) 再合并. 这个操作序列与 \([l,k-1]\) 操作的相对位置并无大碍, 归并即可.
73. [ABC217G] Groups
tag: dp
trick: 已知前面有多少个位置不能选考虑插入 dp.
简要题意:
对于 \(\forall k \in [1,n]\),求出把 \([1,n]\) 中的 \(n\) 个整数分为非空的 \(k\) 组, 每组任意两个数模 \(m\) 不同余的方案数。
两个方案不同,当且仅当存在两个数,一种方案中它们在同一组, 但在另一种方案中,它们不同组。
对 \(998244353\) 取模。
$ 2 \le M \le N \le 5000$。
题解:
考虑类似于斯特林数的 dp , 设前 \(i\) 个数放到 \(j\) 个盒子里的方案数 \(f_{i,j}\), 考虑转移的时候加入一个新盒子, 由于原来的那些互斥的数都在不同的盒子里, 因此能轻易计算出不能放进多少个盒子, 直接 dp 即可.
74. [ABC218G] Game on Tree 2
tag: 博弈论
trick: 使用对顶堆/线段树/平衡树支持插入/删除动态维护中位数, 到达某状态的操作得分是固定的考虑提前计算, 用dfs来维护父链信息.
简要题意:
给定一棵树,以及树各节点的点权(点权为偶数)。起初有一个棋子在树的根结点(结点 \(1\))处。
- \(A\) 与 \(B\) 两人轮流操作:将棋子移动到其所在节点的某个叶子节点。
- 到某个节点的得分定义为:棋子经过所有结点点权的中位数。\(K\) 个数的中位数定义如下:
- 当 \(K\) 为奇数时,中位数为 \(K\) 个数中第 \(\frac{K+1}{2}\) 小的值。
- 当 \(K\) 为偶数时,中位数为 \(K\) 个数中第 \(\frac{K}{2}\) 小与第 \(\frac{K}{2}+1\) 小的两数的平均值。
- \(A\) 希望最后得分尽可能大,\(B\) 希望最后得分尽可能小。
- 当棋子到达某个叶节点时,游戏结束。
若 \(A\) 先手操作,\(A\),\(B\) 都采取最优策略,求最终得分。
题解:
发现到达每个叶节点时的得分是固定的, 用 dfs 维护父链的权值集合, 求出来每个叶节点的得分.
然后 dp 求博弈状态即可.
75. [ABC219G] Propagation
tag: 图论, 根号分治
trick: 在图上操作与相邻点有关可以根据度数根号分治.
简要题意:
给你一个 \(n\) 个点 \(m\) 条边的无向图, 每个点上有数 \(a_i\). 初始情况下, \(a_i=i\).
现在进行 \(q\) 次操作, 每次给定一个数 \(u\). 对于所有与 \(u\) 直接相连的点 \(v\), 把 \(a_v\) 改为 \(a_u\).
所有操作后, 求 \(a\) 序列.
\(n,m,q \le 2\times 10^5\).
题解:
考虑对度数根号分治, 对每个节点维护它的颜色和它的修改时间, 对每个重节点额外维护他上次被修改的时间和颜色.
对轻节点操作时, 首先遍历它相邻的所有重节点更新自己的颜色, 然后暴力枚举每个相邻节点去染色.
对重节点操作时, 首先遍历它相邻的所有重节点更新自己的颜色, 然后更新自己的 tag 实现懒更新.
复杂度 \(O(n \sqrt n)\).
76. [ABC221F] Diameter set
tag: 树的直径
trick: 对直径长度奇偶性分讨, 直径中心左右分别考虑, 直径必共用中心点.
简要题意:
给你一个 \(n\) 个顶点的无根树, 记 \(d\) 为它的直径.
求使得顶点集合 \(S\) 中任意两个顶点的距离为 \(d\) 的集合个数, 对 \(998244353\) 取模.
\(S\) 中至少要有两个数.
\(n \le 2 \times 10^5\).
题解:
考虑先找树的直径, 那么考虑分讨直径的奇偶性:
-
若长度是偶数, 则中心在一个点上, 那么把这个点为根所有子树计算深度为 \(\frac{len}{2}\) 的点的数量, 然后把 \(\prod (cnt+1)\) 贡献到答案里再减掉集合大小小于等于 \(1\) 的即可.
-
若长度是奇数, 那么中心在一条边上, 这时候类似上面的过程, 但只需要找两边即可.
77. [ABC222F] Expensive Expense
tag: 树的直径
trick: 对于单独点权贡献拆点为边权, 线段树在 dfs 中动态维护全局信息, 子树操作考虑 dfn 序, 最大距离考虑树的直径.
简要题意:
有一颗 \(n\) 个点,\(n - 1\) 条边带边权的树,现在定义从点 \(i\) 到点 \(j\) 的距离是点 \(i\) 走到点 \(j\) 路上的边权和加上 \(d_j\),问每个点到其它点的最长距离.
\(n \leq 2 \times 10 ^ 5\).
题解:
sol 1:
考虑在 dfs 的过程中动态维护到其他所有点的信息, 那么进入一个子树意味着子树减, 其余位置加. 这个操作用线段树在 dfn 序上维护即可.
sol 2:
考虑把点权建虚点把点权弄没, 然后转化成求树上每个点到除自己的虚点以外的点的最长路径.
最远距离考虑树的直径, 那么对于非直径两端的点, 到两端点距离即可; 另外两个点暴力 dfs 即可.
78. [ABC222G] 222
tag: 数论
trick: 用 \(\frac{10^x-1}{9}\) 描述 \(1111\dots\), 转化成指数和 \(1\) 同余, \(a^x\equiv 1 \rightarrow x |\varphi(P)\).
简要题意:
定义数组 \(A=\{2,22,222,2222,...\}\) ,给出 \(q\) 次询问,每次询问给出一个数 \(k\),求最小的 \(x\) 使得 \(A_x\) 是 \(k\) 的倍数, 或者报告无解。
\(q \leq 200, k \leq 10^8\).
题解:
首先尝试转化成式子:
枚举因数检验即可.
79. [ABC223G] Vertex Deletion
tag: 树的匹配
trick: 最大匹配=点数-最大独立集, 在换根时用递推维护子树外信息.
简要题意:
给定一棵树,其中有 \(N\) 个节点。求出满足以下条件的点 \(u\) 的数量:
- 把 \(u\) 和连接 \(u\) 的边全部删除后得到的图的最大匹配与原树的最大匹配相等。
\(2\leq N \leq 2\times 10^5\)。
题解:
考虑转化为最大独立集, 而删掉一个点等价于钦定这个点不选.
那么考虑换根, 在换根的同时维护子树外选不选 \(fa_u\) 的最大独立集大小 \(g_{u,0/1}\) 即可.
递推时考虑先把 \(f_{fa_u}\) 撤销 \(u\) 贡献, 然后把 \(f_{fa_u}\) 和 \(g_{fa_u}\) 做合并转移即可.
80. [ABC224G] Roll or Increment
tag: 期望
trick: 列方程解期望, 均值不等式求式子最值, 设置阈值分讨策略.
简要题意:
有一个 \(N\) 面的骰子,每个骰子都有相等的概率随机出现 \(1\) 到 \(N\) 之间的整数目。
最初,骰子的放置方式是掷出一个整数 \(S\) 。
您可以对这些骰子进行 "以下两种操作中的任意一种",次数不限(甚至可以是零次)。
- 支付 \(A\) 元,掷出的骰子值增加 \(1\), 如果操作前掷出的骰子是 \(N\) ,则无法执行此操作。
- 支付 \(B\) 元并重新掷骰子。
考虑通过上述操作将骰子从掷出 \(S\) 的初始状态变为掷出 \(T\) 的状态。
输出采取最优策略时的成本的期望值。
题解:
考虑最优策略一定存在一个阈值 \(x\), 当前值小于 \(x\) 时就 roll, 大于 \(x\) 时考虑暴力加.
列出方程解一下即可.
81. [ABC226F] Score of Permutations
tag: 爆搜
trick: 数据范围较小考虑爆搜, 周期是排列每个环的 lcm.
简要题意:
对于一个排列 $ p $,我们记他的权值为 $ S(p) $,要求你求出对于 $ 1 $ 到 $ n $ 的 $ n! $ 种排列的权值的 $ k $ 次方的和。
其中,$ S(p) $被定义为如下过程的重复次数:
初始有一个数组 $ a $ 满足 $ \forall i \in [1,n] $,有 $ a_i = i $。
\(\forall i \in [1,n]\),$ a'_{p_i} := a_i $。
\(a = a'\)
如果满足 $ \forall i \in [1,n] $, \(a_i = i\) 则结束此流程。
\(n \leq 50\).
题解:
考虑数据范围较小, 直接枚举 \(50\) 的整数拆分, 然后组合计数即可.
82. [ABC226G] The baggage
tag: 爆搜
trick: 贪心(从大到小拆解).
简要题意:
有体积为 \(i(1≤i≤5)\) 的物品和力量为 \(j(1≤j≤5)\) 的人,分别为 \(a_i\) 和 \(b_j\) 个。力量为 \(x\) 的人总共可以搬体积不超过 \(x\) 的物品(物品不能切碎),问能否搬完。
题解:
考虑贪心, 首先 \(i\) 的物品一定能被 \(i\) 的人抵消, 先消完, 其次从大到小, 如果 \(4\) 的物品有剩余, 那么只能考虑 \(5=4+1\) 的人拆解. 在这之后, 把 \(5\) 的人按照 \(3+2\) 全部拆解掉.
然后, 如果有 \(3\) 的物品剩余, 先用 \(3\) 的人抵消, 然后 \(4=3+1\), 剩余的 \(4\) 都考虑 \(4=2+2\) 拆解.
大小不超过 \(2\) 的随便做.
83. [ABC227E] Swap
tag: 逆序对, dp
trick: 能够知道当前元素和前面的元素产生多少贡献考虑插入 dp, 最小交换次数等于对应位置排列逆序对.
简要题意:
给定一个字符串 \(S\) 和一个非负整数 \(K\),求从 \(S\) 开始至多进行 \(K\) 次相邻字符的交换,可以生成多少种不同的字符串。
\(2\le |S|\le 30\),\(0\le K\le 10^9\),\(S\) 只包含字符 K
、E
、Y
。
题解:
考虑最小交换次数等于对应位置排列逆序对, 而逆序对个数可以根据当前已经填了什么求下一个元素的贡献, 考虑插入 dp.
设 \(f_{c_1,c_2,c_3,k}\) 表示当前填了 \(c_i\) 个 \(i\) 字符, 需要 \(k\) 次交换的构造方案数.
考虑加入一个元素 \(i\), 逆序对也就是在原序列 \(i\) 右边的元素有多少已经加进来了, 这个做个前缀和是容易的, 因此 \(O(1)\) 转移即可.
84. [ABC227F] Treasure Hunting
tag: dp, 第 k 大
trick: 与第 k 大有关的 dp 考虑记录目前有多少个记录进答案和标准第 k 大是多少.
简要题意:
给你一个 \(N \times M\) 的矩阵,你需要从坐标 \((1,1)\) 走到坐标 \((N,M)\) 去,每次只能向右或者向下走。
坐标 \((i,j)\) 的价值是\(A_{i,j}\)。
我们定义一条路径的价值是,这条路径经过的坐标的前 \(K\) 大的价值之和。
问:所有路径中,价值最小的路径,价值是多少?
\(1 \leq N,M \leq 50\).
题解:
设 \(f_{i,j,k,x,y}\) 表示走到 \((i,j)\), 当前有 \(k\) 个计入答案, 标准第 \(k\) 大是 \(a_{x,y}\) 的最小答案.
转移只需考虑 \(a_{i,j}\) 和 \(a_{x,y}\) 的关系分讨即可.
85. [ABC227G] Divisors of Binomial Coefficient
tag: 组合数学, 约数
trick: 想获得 \(\sqrt V\) 以上的质约数可以用 \(\sqrt V\) 以下的去筛, 对质因数根号分治.
简要题意:
求 \(d(\binom{n}{k})\).
\(n \leq 10^{12},k \leq 10^6\).
题解:
考虑 \(d(x)=\prod_p (cnt_p+1)\), 那么考虑对每个质数去记录指数, 由于目标数是一个区间的乘积除另一个区间的乘积, 那么对于小于等于 \(\sqrt V\) 的质数可以暴力做, 而大于的部分可以用小于的去筛.
86. [ABC228F] Stamp Game
tag: 滑动窗口
trick: 有单调性端点的区间最值用单调栈/单调队列.
简要题意:
给你一个 \(h \times w\) 的方格, 每个格子上有一个正整数 \(a_{i,j}(a_{i,j} \le 10^9)\). A 和 B 在上面玩游戏.
A 先覆盖住一个 \(h_1 \times w_1\) 的矩形, B 再覆盖住一个 \(h_2 \times w_2\) 的矩形. 定义游戏的得分为所有被 A 覆盖但没有被 B 覆盖的格子上的数的和.
A 想最大化游戏得分, B 想最小化游戏得分, 且他们都会采取最优策略. 求最后的得分.
\(h,w \le 1000\), \(h_1,h_2 \le h\), \(w_1,w_2 \le w\). 得分可能为 \(0\).
题解:
预处理出以每个点为右下角两个人能够覆盖的总权值 \(A_{i,j}, B_{i,j}\), 此时枚举 \(A\) 的覆盖位置, \(B\) 的策略是找子矩阵的最大值, 可以用二维滑动窗口优化.
87. [ABC229F] Make Bipartite
tag: 二分图, dp
trick: 破环为链, 自身是否被占领作为状态, 环起点是否被占领作为状态, 枚举一个部的点集列式子.
简要题意:
题目描述
给你一张由 \(N+1\) 个点组成的无向图,分别命名为 \(0,1,...,N\)
这张图只有 \(2N\) 条边,用 \(A\) 和 \(B\) 两个数组表示:
- \(A_i\) 表示连接 \(0\) 和 \(i\) 两点的无向边的权值
- \(B_i\) 表示连接 \(i\) 和 \(i+1\) 两点的无向边的权值, 这里,点 \(N\) 与 点 \(1\) 连接
现在要删除若干条边, 使得这个图变成一张二分图,求删除边的最小权值和
$ 3\ \leq\ N\ \leq\ 2\ \times\ 10^5 $
题解:
考虑相当于是一个 \(n\) 等分的披萨要求断成二分图, 枚举外面哪些点是和中心点同一个颜色, 就能列出式子:
这个东西可以用 dp 去决策, 但是它和相临项状态有关系, 考虑把自己是否选作为状态, 另外要破环为链, 把起点的状态也压进去就可以了.
88. [ABC229G] Longest Y
tag: 交换
trick: 最小交换次数等于对应位置排列逆序对, 贪心(到中位数距离和最小), 贪心(区间更优), 基于单调性的双指针.
简要题意:
给你一个字符串 \(S\),由 Y
和 .
构成。
现在你可以最多进行 \(k\) 次操作,每次可以交换两个相邻的字符。
请你求出最多 \(k\) 次操作后,最长连续字符 Y
的长度。
题解:
考虑答案一定是把一个区间的 \(Y\) 都包含了.
考虑双指针往右扫, 如果右边能扩展就扩展, 右边扩展不了左边扩展.
如何 check 呢? 需要能够求出最小操作数, 由于全部移到中位数是最优的, 尝试动态维护一个类似于二位偏序的东西维护逆序对个数就行了.
89. [ABC230F] Predilection
tag: 前缀和
trick: 把答案序列做前缀和做双射, 需要不重的计数 dp 考虑上一次重复的位置在哪.
简要题意:
有一个长度为 \(N\) 的数列 \(A_i\)。
你可以进行若干次,最多 \(N-1\) 次操作,选择相邻的两个数,删去他们,并在原位置放上他们两个的和。
现在你需要求出可能产生的序列个数。
\(1 \le N \le 2 \times 10^5, |A_i| \leq 10^9\)
题解:
对答案序列做前缀和, 发现这是原序列前缀和的一个子序列.
问题转化为原序列的前缀和的不同的子序列有多少个.
考虑 dp, 设 \(f_i\) 表示前 \(i\) 个元素能组成的不重子序列个数.
考虑会算重多少. 如果不加入自己的话, 那么一定不会算重, 因为本来就不重. 如果加入自己的话, 算重的个数就等于 \(a_i\) 上一次出现的位置的前一个位置的 \(f\) 值, 因为那里的每一个序列加上一个 \(a_i\) 后在这个位置也能被生成, 而那个位置没有的序列加上一个 \(a_i\) 后是不重的. 所以有 \(f_i=2f_{i-1}+1-f_{lst_i-1}\).
90. [ABC233F] Swap and Sort
tag: 构造
trick: 连通块内交换一定能排序.
简要题意:
给你一个长度为 \(n\) 的排列和 \(m\) 种操作. 每个操作形如 \((u,v)\) , 表示将 \(a_u\) 和 \(a_v\) 交换 .
请问是否存在一种方案, 经过适当操作(每次操作只能选择上面 \(m\) 个中的一个), 把这个排列变为 \((1,2,3,\dots,n)\)? 如果可以, 请给出一种构造, 要求长度不超过 \(5 \times 10^5\). 否则请输出 \(-1\).
\(n \le 10^3 , m \le 2 \times 10^5\).
题解:
考虑建图, 在每个连通块内找一颗生成树, 然后每次把叶子满足就可以了.
91. [ABC233G] Strongest Takahashi
tag: dp
trick: 每次消除一个区间考虑区间 dp.
简要题意:
给定有一个 \(N \times N\) 的地图 \(S\),若 \(S_{i, j}\) 是 #
,则位置 \((i,j)\) 上有障碍。
高桥可以进行下面的操作 \(0\) 次或更多次:
- 首先,在 \(1\sim N\) 之间选择一个整数 \(D\),并在地图内选择一个 \(D \times D\) 的子矩阵。
- 消耗 \(D\) 的代价摧毁子方格内的所有障碍。
求摧毁所有障碍所需的最少代价。
题解:
考虑区间 dp, 设 \(f_{l,r,u,d}\) 表示把 \((l,d)\) 到 \((r,u)\) 之间的消完的最小代价, 转移考虑枚举没有障碍的行和列从两边转移即可.
92. [ABC234G] Divide a Sequence
tag: dp
trick: dp优化(单调栈)
简要题意:
给定长度为 \(N\) 的序列 \(A\),我们定义一种将 \(A\) 划分为若干段的方案的价值为每一段的最大值减去最小值的差的乘积,你需要求出所有划分方案的价值的总和,答案对 \(998244353\) 取模。
题解:
首先 dp 是一眼的.
考虑优化, 枚举最大值是什么, 动态维护对应的区间, 发现每个端点就是单调栈的元素. 于是用单调栈去模拟即可.
93. [ABC235F] Variety of Digits
tag: dp
*trick: dp(按数位从前向后), 填数不区分是什么数只关心个数无需状压
简要题意:
现在给你 \(M\) 个数字 \(c_1, c_2,...,c_M\)。
求 \(N\) 以内有多少个数满足,去掉前导零后,\(M\) 个给定数字在剩下的数字中出现。请你输出满足条件的所有数的和。
\(n \le 10^{10^4}\),\(M \le 10\)。
题解:
考虑设 \(f_{i,j}\) 表示填了 \(i\) 位, 目标字符集中有 \(j\) 个已经出现过, 转移即可.
94. [ABC235G] Gardens
tag: dp
trick: \(\binom{n}{m}=\binom{n-1}{m-1}+\binom{n-1}{m}\) 求解递推式
简要题意:
有三种不同颜色的球,分别有 \(A,B,C\) 个。(相同颜色的球之间不区分)
将球放入 \(N\) 个不同的盒子中,要求:
-
每个盒子至少放了一个球
-
每个盒子不能存在两个相同颜色的球
-
可以不放完所有的球
求放置方案数对 \(998244353\) 取模的结果。
题解:
考虑不存在第一个约束的话, 答案式子如下:
加上第一个约束就需要容斥, 答案式子为:
考虑如何对所有 \(i \in [0,n]\) 快速求出 \(\sum_{j=0}^A\binom{i}{j}\).
设 \(f_i=\sum_{j=0}^A\binom{i}{j}\), 那么有:
递推即可.
95. [ABC236F] Spices
tag: 线性基, 贪心
trick: 贪心(从小到大考虑每一个能否加入), 线性基维护异或生成的集合
简要题意:
有 \(2 ^ N - 1\) 个数字,分别编号为 \(1, 2, \dots, 2 ^ N - 1\),想获得编号为 \(i\) 的数字需要支付 \(c_i\) 的代价。
现在你可以从这些数字中选出一些数,使得你可以通过你选择的某些数的编号的异或和来表示出 \([1, 2 ^ N - 1]\) 中的所有数。
请你求出最少需要支付多少代价。
题解:
把所有数按照代价从小到大排序, 能插入线性基就插入, 不能考虑下一个即可.
96. [ABC238F] Two Exams
tag: dp, 排序
trick: 顺序无关则可以排序, 把 dp 能否选择的限制压入状态
简要题意:
有 \(n\) 个二元组 \((x_i,y_i)\), 其中 \(x,y\) 分别形成 \(1\) 到 \(n\) 的排列. 从全集 \(U={1,2,\dots, n}\) 中决策一个 \(S \in U\), 使得:
\(\forall i,j\in U,[i\in S, x_j<x_i,y_j<y_i \Rightarrow j \in S]=1\).
求合法的 \(S\) 的数量.
题解:
考虑 dp, 首先按照 \(x\) 排序, 从小到大决策, 考虑能选当且仅当 \(y_i\) 比所有没有选的 \(y_i\) 都要小, 那么我们设 \(f_{i,j}\) 表示在前 \(i\) 个元素中选择, 其中没有选择的元素的 \(y\) 最小值是 \(j\) 方案数即可.
转移只需要考虑枚举当前元素选不选即可, 选的话判一下能不能选, 不选的话更新最小值.
97. [ABC238G] Cubic?
tag: 莫队, 根号分治, 哈希
trick: 发现询问支持加入和删除一个元素考虑莫队, 所有元素各自的和都是 \(k\) 的倍数考虑随机化, 对质因数根号分治
简要题意:
- 给你一个长度为 \(N\) 的序列 \(a_{1... n}\)。
- 有 \(Q\) 次询问,每次询问给出 \(l
,r\),你需要回答
\(\Pi_{i=l}^r\ a_i\)是否是一个完全立方数(即是否可以表示为一个自然数的三次方)。
\(1\leq A_i\leq 10^6, 1\leq N,Q \leq 2 \times 10^5\).
题解:
sol1:
考虑对质因子根号分治, 这个时候小于根号的质因子可以暴力前缀和 check, 而大于的每个数只会有一个, 考虑莫队处理. 总复杂度 \(O(n\sqrt n)\).
sol2:
考虑原题意味着每个数都是一个向量, 查询区间每个向量之和的每一维是否都是 \(3\) 的倍数.
考虑给每个质数赋一个 \([0,3)\) 的随机权值, 这样把这个向量直接加起来, 如果合法的话前缀和也一定是 \(3\) 的倍数.
考虑多随几组就可以了.
98. [ABC239F] Construct Highway
tag: 构造, 树论, 度数
trick: 并查集维护连通块, 归纳性构造
简要题意:
给定 \(n,m\) 和度数数组 \(\{d_i\}\),再给你 \(m\) 条边,请构造一棵 \(n\) 点的树包含这 \(m\) 条边,且第 \(i\) 个点的度数为 \(d_i\),或者判断无解。
题解:
考虑先把有边的缩起来, 然后把对应的度数减掉, 这时如果剩余度数不是连通块个数减一的二倍, 那么不能成一棵树; 如果有一个块的度数非正, 那么也无解.(但如果只有一个连通块除外).
如果一个连通块内部的点的度数和只有 \(1\) 了, 我们认为这是一个叶子连通块, 我们每次都找一个叶子连通块往任意一个非叶连通块上连边, 这样一定合法, 正确性考虑归纳证明.
99. [ABC242F] Black and White Rooks
tag: 组合计数, 容斥
trick: 二项式反演容斥, 钦定计数
简要题意:
考虑在一个 \(N\) 行 \(M\) 列的棋盘上放置 \(B\) 只黑车和 \(W\) 只白车。一个好的放置方式应满足以下条件:
- 没有一对黑车和白车可以互相攻击.
求好的放置方式的数目。由于答案可能很大,输出对 \(998244353\) 取模的结果。
同种颜色的车不区分。
\(1 \le N,M \le 50\).
题解:
考虑一个合法的方案是考虑有多少列, 多少行分配给了白棋, 多少列, 多少行分配给了黑棋, 枚举一下就有下面的式子:
其中 \(f_{i,j}\) 表示在 \(i\) 行 \(j\) 列上放棋子, 任意一行一列非空的方案数.
考虑二项式反演去求这个东西就可以了.
100. [ABC242G] Range Pairing Query
tag: 莫队
trick: 发现询问支持加入和删除一个元素考虑莫队
简要题意:
给出长度为 \(N\) 的数列 \(A_i\),表示第 \(i\) 个人衣服颜色为 \(A_i\)。有 \(M\) 次询问 \([l,r]\) 区间最多能组成多少对衣服颜色相同的人。
$ 1\ \le\ N, Q\ \le\ 10^6 $
题解略.
101. [ABC243F] Lottery
tag: 概率
trick: 一件概率为 \(p\) 的事 \(k\) 次中恰出现 \(j\) 次的概率是 \(\binom{k}{j}p^j(1-p)^{k-j}\), 考虑加入一个元素枚举这个元素出现次数计算对概率影响
简要题意:
一个游戏的抽卡池里有 \(n\) 种角色,每种角色的数量无限多,第 \(i\) 个角色被抽出的概率是 \(\frac{W_i}{\sum_{j=1}^{n}W_j}\),你的钱包只够你氪金抽 \(k\) 次,问你最后恰好抽到 \(m\) 种不同的角色的概率是多少,答案对 \(998244353\) 取模。
\(1 \leq K \leq 50, 1 \leq M \leq N \leq 50.\)
题解:
考虑 dp , 设 \(f_{i,j,k}\) 表示抽 \(j\) 下, 抽到的物品全部是前 \(i\) 种, 有 \(k\) 个互不相同的的概率.
转移设前 \(j\) 次抽卡中抽到了 \(d\) 个 \(i\), 那么 \(f_{i,j,k}\leftarrow \binom{j}{d}(\frac{w_i}{\sum w_i})^df_{i-1,j-d,k-1}\).
102. [ABC243G] Sqrt
tag: dp
*trick: 转移的分档不多, 每次取根号很快能到 \(1\) *
简要题意:
你现在有一个数 \(X\)。
每次你可以进行以下操作:
- 设末尾的数是 \(Y\)。在 \(1\) 到 \(\sqrt{Y}\) 中选取一个数 \(Z\)。
- 把 \(Z\) 加到序列的末尾。
如此进行 \(10^{100}\) 次操作,问一共有多少种可能的情况。
可以证明,答案不超过 \(2^{63}-1\)。
\(X \le 9 \times 10^{18}\)。多组数据。
题解:
设 \(f_{i,j}\) 表示第 \(i\) 个元素是 \(j\) , 前面的方案数.
首先不难发现, 对于所有 \(j\in [1,\lfloor \sqrt V\rfloor]\), 都有 \(f_{1,j}=1\).
第二层模拟转移, 第三层前缀和优化转移就可以了.
复杂度 \(O(10 \sqrt[4]{V})\).
103. [ABC244G] Construct Good Path
tag: 构造
trick: 把图上的构造压缩到树上, dfs的过程让子树合法
简要题意:
给定一个 \(N\) 个点 \(M\) 条边的无向简单连通图,以及一个长为 \(N\) 的 01 串 \(s_i\)。求一条长度不超过 \(4N\) 的路径(可重复经过点或边,不必非空)\((A_i)_m\) 使得 \(i\) 号结点在路径序列中出现次数模 \(2\) 余数为 \(s_i\)。多种答案可以输出任意一种合法方案。
保证 \(2\le N\le 10^5\),\(N-1\le M\le\min\{2\times 10^5,\frac{N(N-1)}2\}\)。
保证在上述条件下答案一定存在。
题解:
考虑在图上什么也不会,考虑能否在一棵生成树上完成构造.
考虑一棵搜索树, 搜索到一个节点 \(x\) 时, 先搜索它的所有子树, 回溯到它自己时, 如果 \(c_x\not=s_x\), 那么考虑先走到 \(fa_x\), 然后回到 \(x\), 再回到 \(fa_x\), 完成回溯.
这样就能保证搜索过程中时时刻刻保证当前节点 \(x\) 的子树是完全合法的.
如果根不合法怎么办? 考虑先走到一个儿子, 走回来, 再走回那个儿子, 这样就合法了.
不考虑最后的, 每条边最多经过三次.
104. [ABC245G] Foreign Friends
tag: 构造, 多源最短路
trick: 对于"不同"的约束可以考虑枚举哪个二进制位不同, 到一些点的最短距离考虑多源最短路
简要题意:
给 \(N\) 个点,\(M\) 条边,每个点的颜色(值域为 \([1,K]\))。并给定 \(L\) 个点作为特殊点。
询问 每个点到最近的与其颜色不同的特殊点的距离(无解输出 -1
) 。
题解:
如果没有颜色, 那么就直接多源 dij.
有颜色的情况, 考虑直接枚举是哪个二进制不同, 然后让这一位是 \(1\) 的全部贡献给这一位是 \(0\) 的, 让这一位是 \(0\) 的全部贡献给这一位是 \(1\) 的.
105. [ABC246G] Game on Tree 3
tag: 博弈论
trick: 把 dp 的一维二分答案掉, 把需要的提前贡献作为一维
简要题意:
给定一棵树,有点权,B 初始在 \(1\),每轮 A 选择一个点将权值变为 \(0\),然后 B 移动一次,B 可在任意时刻停止游戏然后获得所在点上的权值的得分,两人均采取最优策略那么最终 B 最少会拿到多少的得分。
题解:
考虑设 \(f_{i,j}\) 表示如果 A 想要 B 的得分不大于 \(j\), 那么 A 需要在 B 到达 \(i\) 节点前在 \(i\) 子树内操作的次数.
考虑转移:
很好理解, 儿子中可以留一步过去了在做, 剩下的都要提前做.
发现转移中 \(j\) 这一维始终独立, 不互相依赖; 又发现答案有单调性, 因此可以二分答案把 \(j\) 这一维替代掉, 用 \(f_1=0\) check 即可.
106. [ABC247G] Dream Team
tag: 网络流
trick: 最大流刻画有约束的匹配问题
简要题意:
平面中有 \(n\) 个点,坐标为 \((a_i,b_i)\),权值为 \(c_i\)。
对于每一行每一列最多只能选一个点,最大化选点个数 \(k\) 并输出。
对于每个 \(i,i=1,2……k\),最大化选出 \(i\) 个点的权值和。
\(1 \leq A_i,B_i \leq 150\)
题解略.
107. [ABC249E] RLE
tag: dp
trick: 转移的段数不太多, 把目前已有的代价作为一维
简要题意:
给定一种字符串压缩算法:对于连续的相同字母,会压缩成 该字母 + 出现次数 的形式,例如 aaabbcccc
会被压缩成 a3b2c4
,aaaaaaaaaa
会被压缩成 a10
。
字符集为英文小写字母,给定 $ n, p $,求对于所有长度为 $ n $ 的字符串,有多少满足压缩后的字符串长度严格小于原字符串。对 $ p $ 取模。保证 $ p $ 为质数。
\(N \leq 3000\).
题解:
考虑设 \(f_{i,j}\) 表示一个长度为 \(i\) 的串, 目前压缩完长度是 \(j\) 的方案数.
转移考虑 \(f_{i,j} = \sum_{k=0}^{i-1}f_{k,j-d-1}\), 由于 \(d\) 的取值只有 \(\log n\) 个, 枚举 \(d\) 后用前缀和优化即可.
108. [ABC250F] One Fourth
tag: 计算几何, 双指针
trick: 基于单调性的双指针
简要题意:
给定凸包,逆时针给定凸包的每个顶点。你需要通过连结两个顶点将凸包划分为两部分并选择其中一个。令凸包面积为 $ a $,选定部分面积为 $ b $,需要最小化 $ 8 \times \lvert \dfrac{a}{4} - b \rvert $,求最小值。易证该值为整数。
题解略.
109. [ABC250G] Stonks
tag: 反悔贪心
trick: 序列上的网络流状决策问题考虑反悔贪心, 反悔贪心要维护两个相邻时刻间最优解的转化
简要题意:
你要买一家公司的股票,现在你知道每天这个股票值 \(p_i\) 元。
每天你要么买进一股,要么卖出一股,或者不操作,不能进行多个操作。
如果第 \(n\) 天结束后还有剩余的股票,作废。
问你最多能得多少钱?注意,你最开始很富有,不会担心买不起股票。
\(n \le 2 \times 10^5\),\(p_i \le 10^9\)。
题解:
考虑反悔贪心.
发现每个元素有三种状态:
卖 \((+v)\), 不干活 \((0)\), 买 \((-v)\).
这样的话, 我们考虑让当前仓库中的物品数作为另一个指标, 并且这个指标任意时刻非负, 同时不难发现, 这个指标是 \(0\) 的时候才可能最优.
因此, 从左往右扫, 每扫到新的一天, 就先默认这一天卖了, 往堆里扔一个 \((v,2)\), 然后从堆里找到权值最大的数对, 把第二维减一, 如果仍然为正就塞回堆里, 意味着那一天什么都不做; 反之则是那天买东西了.
110. [ABC252G] Pre-Orders
tag: dp
trick: 树上的 dfn 序列每个子树是一个区间, 每次消除一个区间考虑区间 dp
简要题意:
存在一棵 $ n $ 个点的树,给定序列 $ P_n $ 表示树的先序遍历,特别地,已知当一个节点有多个儿子的时候会优先遍历编号较小的儿子。求满足条件的树的方案数。对 $ 998244353 $ 取模。
\(N \leq 500\).
题解:
考虑每个子树本质上是一个区间, 那么不妨考虑区间 dp, 设 \(f_{i,j}\) 表示 \([i,j]\) 能表示一棵树的形态数量, 然后枚举第一棵子树到哪即可, 剩下的虽然是一个森林, 但是可以认为前面那个点是一个虚根, 照样转移.
111. [ABC253G] Swap Many Times
tag: 模拟
trick: 把 \((l,l+1),\dots(l,n)\) 交换一遍等于循环移位, 尝试把多轮操作合并
简要题意:
你有一个长度为 \(n\) 的序列 \(a\),初始时,对于每一个 \(i(1\le i\le n)\),满足 \(a_i=i\)。
然后你可以根据 \(n\) 构造出一个长度为 \(\frac{n(n-1)}{2}\) 的二元组序列,包含满足 \(1\le l<r\le n\) 的所有二元组 \((l,r)\)。并且将得到的序列以 \(l\) 为第一关键字,\(r\) 为第二关键字由小到大排序。
例如,当 \(n=4\),时,二元组序列为:
定义一个二元组 \((l,r)\) 对应的操作为交换 \(a_l\) 和 \(a_r\)。
给出一个 \(L\) 和一个 \(R\),要求你求出在执行完第 \(L\) 个到第 \(R\) 个二元组所对应的操作后的序列。
题解:
考虑把一个固定的 \(l\) 执行完意味着循环移位一次, 而把多个 \(l\) 执行完就是循环移位好几位, 那么散着的 \(l\) 暴力做, 中间的整体一块做即可.
112. [ABC256F] Cumulative Cumulative Cumulative Sum
tag: 前缀和
trick: 把高阶前缀和转化为式子, 多个式子分别用 BIT 维护
简要题意:
已知一个长度为 \(N\) 的序列 \(A\),你需要进行\(Q\) 次操作,它们是以下两种之一:
-
1 x v
:将 \(A_x\) 改为 \(v\)。
-
2 x
:令 \(B_i=\sum_{j=1}^iA_j,C_i=\sum_{j=1}^iB_j,D_i=\sum_{j=1}^iC_j\),求出 \(D_x\) 对 \(998244353\) 取模的结果。
题解:
用三个 BIT 维护一下即可.
113. [ABC256G] Black and White Stones
tag: 枚举, 矩阵快速幂
trick: dp优化(矩阵快速幂), 破环为链, 环起点是否被占领作为状态, 自身是否被占领作为状态
简要题意:
你现在有一个正 \(n\) 边形 , 边长为 \(d\)。从顶点开始,你每个长度 \(1\) 放一个石子,白色或者黑色。换句话说,每条边上有 \(d+1\) 个石子,相邻两边公用一个石子。
请问有多少种方案,使得所有边上的白色石子数量相同。对 \(998244353\) 取模。
\(n \le 10^{12}\),\(d\le 10^4\).
题解:
考虑先枚举每条边上有多少式子, 然后考虑破环为链的 dp, 由于有公共点, 因此我们需要把自身是否被占领压入状态; 由于 \(n\) 比较大, 因此我们需要用矩阵快速幂优化.
114. [ABC257G] Prefix Concatenation
tag: 哈希, kmp
trick: 哈希(串相等), 跳 fail 枚举border, 用 border 反映周期
简要题意:
给定仅存在小写英文字母的字符串 $ S, T $。你需要将 $ T $ 分割成 $ k $ 个 $ S $ 的前缀(或着说用 $ S $ 的若干个前缀组成 $ T $),最小化 $ k $,输出最小值。若 $ k $ 不存在输出 -1
。
题解:
先跑一遍 kmp, 然后枚举周期, 再用 hash 判断是否和 \(S\) 的前缀相等即可.
115. [ABC258F] Main Street
tag: 分讨
trick: 分讨最优策略
简要题意:
你要在平面直角坐标系中行走,每一步可以上下左右四个方向任意移动 $ 1 $,耗时 $ k $ 秒。特别地,存在若干条快速通道,若该步起点和终点均满足 $ x \equiv 0 \pmod{B} $ 或 $ y \equiv 0 \pmod{B} $,则认为该步是在快速通道上进行,仅需耗时 $ 1 $ 秒。询问从 $ (S_x, S_y) $ 到 $ (G_x, G_y) $ 最少需要多少秒。存在多组数据。
题解:
两种情况做分讨:
-
走快速通道, 那么就从 \(S\) 垂直走向网格传送后走到 \(G\) 即可.
-
不走快速通道, 直接计算曼哈顿距离的代价.
116. [ABC258G] Triangle
tag: bitset, 三元环计数
trick: 可达性问题用 bitset 优化, 给无向图定向约束入度/出度数量级
简要题意:
在一个图上做三元环计数. \(n \leq 3000\).
题解:
sol1: 三元环计数
考虑把整张图按照 \((度数, 点编号)\) 的偏序关系定向, 然后考虑先枚举 \(u\), 然后枚举每一个 \(v\), 最后枚举 \(v\) 的每一条出边 \((v,w)\), 判断是否存在 \((u,w)\) 即可.
下面证明其复杂度是 \(O(m\sqrt m)\).
考虑对复杂度做一个描述, 那么显然是 \(O(\sum_{(u,v)}out_v)\).
考虑一个在原图上度数不超过 \(\sqrt n\) 的点, 定向后他的度数不会变大, 依然是根号级别;
一个在原图上度数超过 \(\sqrt n\) 的点, 它所指出的点的度数都一定比根号大, 而这样的点一共只有根号个, 因此它的出度不会超过根号.
综上所述, 所有节点的出度都是根号级别的, 因此 总复杂度 \(O(n\sqrt n)\).
sol2 : bitset 优化
考虑枚举三元环上的两个点, 第三个点一定是这两个点邻接点集合的交集. 用 bitset 模拟即可.
117. [ABC259F] Select Edges
tag: dp
trick: 自身是否被占领作为状态, 贪心(极端值)
简要题意:
给定一棵 \(n\) 个节点的树,每条边有一个权值 \(w_i\)。
现要求选择一些边,使得每个节点 \(i\) 相邻的边中被选中的不超过 \(d_i\) 条,请求出最大边权和。
题解:
考虑设计 dp, 设 \(f_{i,0/1}\) 表示 \(i\) 子树内选/不选父边的最大贡献, 转移时贪心即可.
118. [ABC260F] Find 4-cycle
tag: 枚举
trick: 变更主元
简要题意:
给定一个二分图,其左部点的个数为 \(S\),右部点的个数为 \(T\),边数为 \(M\),请找出一个四元环,任意顺序输出这 \(4\) 个节点,如果不存在则输出 \(-1\)。
\(1\leq T\leq 3000.\)
题解:
考虑一个四元环一定在左右跳两次, 对于一个右边的点对 \((i,j)\), 如果他俩在左边有两个中转点, 那么就有答案了.
实现的时候考虑不妨去枚举左边的点的每一个出边二元组, 这样去枚举由于保证终点对不重, 重了就直接输出, 因此复杂度也是对的.
119. [ABC260G] Scalene Triangle Area
tag: 三维偏序, 差分
trick: 把约束条件看成偏序去贡献, 把矩阵拆成几个不同规则的差分矩阵
简要题意:
我们有一个 \(N\times N\) 的方阵,由 XO 组成,对于一个位于 \((s,t)\) 的 O,他可以控制的范围是 \((u,v)\),满足:
-
\(s\le u.\)
-
\(t\le v.\)
-
\((u-s)+\dfrac{(v-t)}{2}<M\)。
给定 \(N,M,Q\) 和 \(Q\) 次询问 \(X_i,Y_i\),询问这个位置被几个 O 控制。
\(N \leq 2000, X_i,Y_i \leq N\).
题解:
sol1:
把约束式子列成偏序不等式组, 然后跑三维偏序即可.
sol2:
考虑每个修改覆盖的面积是一个三角形:
考虑把它差分掉:
发现还需要做一次差分, 但是仍然无法做到 \(O(1)\), 因为上下的形状不一样.
考虑拆分成多个矩阵做差分:
这个是横着的差分. 斜着的考虑按列的奇偶性分开做, 就可以按照对角线方向差分了.
120. [ABC262F] Erase and Rotate
tag: 构造
trick: 最小表示增加约束防止贡献重复/增加好的性质, 贪心(字典序考虑开头元素)
简要题意:
给定一个排列 \(\{a_n\}\),有两种操作:
-
将最后数提到最前(Rotate)
-
删除一个数(Erase)
求操作不超过 \(k\) 次后最小字典序。
第一行输入 \(n,k\),第二行输入 \(\{a_n\}\)。输出一行数,代表最小字典序。
题解:
考虑钦定先旋转再删除.
另外, 为了防止贡献重复, 我们认为开头的元素不可以删. (因为否则的话可以少旋转一次直接把最后的元素删掉).
有了这样的约束就很好说了. 因为旋转到的第一个元素就是首元素, 让它最大即可.
删除过程中也是贪心就可以了.
121. [ABC263F] Tournament
tag: dp
trick: 把需要的提前贡献作为一维
简要题意:
给定 $ n $,存在 $ 2^n $ 个人站成一排进行比赛,比赛赛制按照类满二叉树进行,即每 $ 2i $ 和 $ 2i - 1 $ 两人进行比赛,胜利者进入下一层继续按照相同赛制比赛,直至最终剩余一人。若第 $ i $ 人获得了 $ j $ 场比赛的胜利,那么将获得 $ C_{i, j} $ 的奖金。你可以任意安排每场比赛的输赢,以最大化所有人的奖金和,求最大值。
题解:
考虑在二叉树上 dp, 设 \(f_{i,j}\) 表示 \(i\) 这个节点的赢家要赢到第 \(j\) 轮, 答案的最大值. 直接分讨谁赢了转移即可.
122. [ABC263G] Erasing Prime Pairs
tag: 图论
trick: 最大流刻画有约束的匹配问题, 考虑增量跑网络流来在流量最大时最小化某条边的流量, 隐藏的二分图(相加为质数)
简要题意:
有 \(n\) 种整数 \(a_i\) ,第 \(i\) 种有 \(b_i\) 个。进行若干次操作,每次在这些数中取出两个,若它们的和为质数,分数加一,操作后把这两个数移去,求最大分数。
\(n \leq 100, a_i \leq 10^7\).
题解:
考虑这是个网络流的匹配问题, 考虑质数除了 \(2\) 以外都必然是奇数加偶数, 所以网络流是二分图.
考虑先把除了 \(1\) 以外的元素跑一遍网络流, 再把 \(1\) 加进去再跑一遍, 这样就可以保证不浪费 \(1\) 元素, 最后考虑 \(1+1=2\) 的匹配即可.
123. [ABC264G] String Fair
tag: 字符串
trick: 末尾的权值作为状态, 用路径描述字符串
简要题意:
在“字符串评鉴大会”上,由小写字母构成的非空字符串 \(S\) 的由 \(N\) 条标准决定:
每条标准是一个字符串 \(T_i\) (\(T_i\) 的长度不超过 \(3\))和对应的得分 \(P_i\),\(S\) 的“美丽度”定义为:
其中 \(C_i\) 为 \(T_i\) 在 \(S\) 中出现的次数。
字符串 \(V\) 在字符串 \(U=U_1U_2 \cdots U_{|U|}\) 中出现的次数定义为:满足 \(1\le i\le \vert U\vert -\vert V\vert +1\) 且 \(U_iU_{i+1}\cdots U_{i+\vert V\vert -1}=V\) 的整数 \(i\) 的数量,其中 \(\vert U\vert\) 表示字符串 \(U\) 的长度。
现在给出 \(N\) 条标准,求出这 \(N\) 条标准下“美丽度”最大的非空字符串 \(S\) 的“美丽度”。如果这个答案是无限大,输出 Infinity
。
题解:
考虑加入下一个字符的贡献只和前两个字符有关, 权值是 \(w_{abc} + w_{bc} + w_{c}\), 然后状态变为 \(bc\).
考虑见图建图后跑最长路即可.
124. [ABC265G] 012 Inversion
tag: 线段树
trick: 线段树模拟 cdq 分治
简要题意:
有一个元素全为 \(0,1\) 或 \(2\) 的数列 \(A = (A_1,A_2,\ldots,A_n)\)。现在有两种操作:
-
1 L R
:询问区间 \([L,R]\) 内的逆序对数量; -
2 L R S T U
:将区间 \([L,R]\) 内的所有 \(0\) 改为 \(S\),\(1\) 改为 \(T\),\(2\) 改为 \(U\)。
题解:
考虑用线段树模拟 cdq 的过程, 考虑在每个节点上提前维护当前节点面对 \(9\) 种操作的答案即可.
125. [ABC266G] Yet Another RGB Sequence
tag: 组合计数
trick: 已知前面有多少个位置不能选考虑插入 dp, 构造提前组合的字符
简要题意:
求符合要求的字符串个数,对 \(998244353\) 取余。
满足要求的字符串 \(s\) 具备以下特性:
-
\(s\) 由
r
、g
、b
构成。 -
\(s\) 中有 \(R\) 个
r
,\(G\) 个g
,\(B\) 个b
,\(k\) 个rg
。
题解:
首先考虑把 rg
绑定, 然后问题转化为有 \(R-k\) 个 r
, \(G-k\) 个 g
, \(B\) 个 b
, \(k\) 个 #
, 要求 g
不能在 r
后面出现.
考虑先不放 g
, 那么方案数是 \(\binom{R+B}{R-k,k,B}\), 然后考虑插入 g
, \(R+B+1\) 个位置里明显有 \(R-k\) 个不行, 那么考虑可空的插板插进去即可.
126. [ABC267F] Exactly K Steps
tag: 树的直径
trick: 最大距离考虑树的直径, 用dfs来维护父链信息
简要题意:
给定一棵有 \(N\) 个点的树,每个点的编号分别为 \(1,2,\cdots,N\);给定的第 \(i(1\leq i\leq N-1)\) 条边连接编号为 \(A_i,B_i\) 的点。
定义两点 \(u,v\) 间的距离为这两个点之间的最短路径所包含的边数。
现有 \(Q\) 组询问,对于第 \(i\) 组询问,给定 \(U_i,K_i\),找到任意一个离结点 \(U_i\) 的距离恰好为 \(K_i\) 的点,或报告无解。
题解:
考虑寻找一条树上以 \(x\) 为一端最长的链, 那么端点一定是树的直径端点.
那么找到直径两个端点, 以他们为根.
现在问题转化为允许离线求树上的 \(k\) 级祖先.
只需要 dfs 过程中维护父链即可.
127. [ABC268E] Chinese Restaurant (Three-Star Version)
tag: 差分
trick: 差分处理等差数列加, 整体维护所有选项的答案
简要题意:
$ n $ 个人进行圆排列,即围坐在圆桌周围,位置编号依次为 $ [0, n - 1] $,给定序列 $ P_n $ 表示第 $ i $ 个人喜欢的菜品在 $ P_i $ 处,$ P_i \in [0, n - 1] $ 且各不相同。定义每个人的沮丧值为其位置与 $ P_i $ 的距离。你可以任意旋转圆桌,以最小化所有人的沮丧值之和,求最小值。
题解:
考虑对于一个人来说, 他会给所有角度的选择加上一个代价, 而加上的形式是两个等差数列, 因此考虑差分掉整体维护代价, 最后还原求最小值即可.
128. [ABC268G] Random Student ID
tag: 期望
trick: 拆贡献(期望拆到概率), 字典树维护字符串前缀
简要题意:
有 \(n\) 个学生,第 \(i\) 个学生的名字是一个字符串 \(S_i\),编号是 \(i\)。
接下来校长要按照一种绝妙的字典序来对这 \(n\) 个学生的名字排序。他随机选取一个 \(\tt{a}\sim\tt{z}\) 的排列,定为 \(P\)。\(P\) 中越早出现的字母,他的字典序就越小。
对于每一个学生,求出他的期望排名,对 \(998244353\) 取模。
保证 \(S_i\) 只由小写字母组成.
题解:
考虑把排名期望拆成每个元素小于自己的概率. 首先, 它一定比是它前缀的大, 一定比是它后缀的小, 剩下的概率都是 \(\frac{1}{2}\).
用字典树统计一下即可.
129. [ABC270G] Sequence in mod P
tag: BSGS
trick: 矩阵 BSGS, 寻找一个相等关系的解可以把未知数拆成两个根号级别大小的集合去碰撞
简要题意:
对于某个无穷序列 \(\{X\}\),构造如下:
求最小的 \(i\) 满足 \(X_i=G\),没有输出 -1
。
多组数据,记 \(T\) 为数据组数,则有 \(1\le T\le100\)。
保证 \(P\) 是质数,\(2\le P\le10^9\)。
保证 \(0\le A,B,S,G< P\)。
题解:
考虑用矩阵刻画这个问题, 最后可以转化成求解 \(A^x\equiv B \mod P\) 的形式 (我们定义两个矩阵同余为他们的对应元素分别同余).
然后考虑 \(x\) 的值域太大, 不能枚举, 我们考虑用增多未知数的代价来减小值域. 引入块长 \(B\), 设 \(x = kB - r,r\in(0,B]\), 那么就有 \(A^{kB}\equiv B\times A^r \mod P\).
我们考虑两边枚举去碰撞即可, 取 \(B = \sqrt P\), 则有复杂度 \(\sqrt P\).
130. [ABC271G] Access Counter
tag: dp, 概率
trick: 末尾的权值作为状态, 预处理状态间转移的概率, dp优化(矩阵快速幂)
简要题意:
给定 \(24\) 个时间点,每个时间点有可能有两种指令
如果指令是 T
,则高桥有 \(x\%\) 的概率登录洛谷。
如果指令是 A
,则青木有 \(y\%\) 的概率登录洛谷。
操作是依次进行的。求洛谷第 \(n\) 次被登录是由青木操作的概率。
答案对 \(998244353\) 取模。
题解:
考虑设 \(f_{i,j}\) 表示第 \(i\) 次登陆是在第 \(j\) 小时的概率.
转移只需要考虑 \(i\) 小时 的下一次登录是在 \(j\) 小时的概率 \(p_{i,j}\) 是多少即可.
考虑列出式子 \(\sum_{q=1}^\infty (\prod_{k=i}^{j-1}(1-p_k))^q p_j\) , 发现是等比数列, 因此直接算即可.
然后考虑这个 dp 可以矩阵快速幂优化, 就做完了.
131. [ABC272G] Yet Another mod M
tag: 绝对众数
trick: 绝对众数考虑随机化
简要题意:
给出一个长度为 \(N\) 的序列 \(A\), 其中 \(A\) 的每个元素均为正整数且互不相同。
你需要选择一个的正整数 \(M\),满足 \(3\leq M\leq 10^9\),并执行一次下列操作:
- 对于 \(1\leq i\leq N\),将 \(A_i\) 替换为 \(A_i\) \(mod\) \(M\)。
若能找到一个数 \(M\) 使得序列 \(A\) 中存在一个数 \(x\),且对于 \(1\leq i\leq N\),满足 \(A_i=x\) 的数量大于 \(A_i\) $ \mathrlap{,/}{=}$ $ x$ 的数量,输出这个 \(M\),否则输出 \(-1\)。
题解:
考虑如何处理绝对众数.
随机化一个 \(a_{i,j}\) 都属于答案集合, 那么一定有 \(M | |a_i-a_j|\), 把差值质因数分解, 然后 \(O(n)\) 去 check 是否合法即可.
132. [ABC273F] Hammer 2
tag: dp
trick: 区间扩张考虑去区间 dp, 末尾的权值作为状态
简要题意:
有一个坐标轴,你一开始在 \(0\) 坐标,你需要走到 \(X\) 坐标,
但是在坐标轴上有 \(N\) 堵墙,坐标为 \(Y_i\),你不能跨越这堵墙除非你有能砸开这堵墙的锤子,第 \(i\) 堵墙的锤子在 \(Z_i\)
问你能不能走到 \(X\) ,若能则输出最小的时间,否则输出 \(-1\) 。
题解:
考虑最优解的行走方案一定是一个左右反复去走, 形如一个区间的扩张.
因此考虑区间 dp, 设 \(f_{l,r,0/1}\) 表示目前已经走过了 \([l,r]\) 的区间, 当前位置是左 / 右端点的最小代价, 转移即可.
133. [ABC274F] Fishing
tag: 枚举
trick: 最小表示增加约束防止贡献重复/增加好的性质, 变更主元, 有贡献的位置是区间
简要题意:
有 \(n\) 条鱼在数轴上移动。
第 \(i\) 条鱼在时刻 \(0\) 时在位置 \(x_i\) 处,价值为 \(w_i\),将会以每时刻 \(t_i\) 的速度向数轴正方向前进。
你是一个渔夫,你有感应河流的能力,你已经知晓所有鱼的 \(x,w,t\) 属性。
你会选择一个时刻 \(t\),在位置 \(x\) 撒下一张长度为 \(a\) 的网,所有在时刻 \(t\) 时处于区间 \([x,x+a]\) 的鱼都会被你捕获。
你想求出你撒一次网能捕获的鱼的价值和的最大值。
对于所有数据,\(1\leq n\leq 2\times 10^3,1\leq a,w_i,x_i,t_i\leq 10^4\)。
题解:
首先考虑, 我们一定能找到一个最优解, 使得网的左边界上有鱼. 那么就可以枚举左边界上是哪一条鱼, 对于其它鱼来说, 能够被捕捉到的时间是一段区间, 考虑按照时间点排序作扫描, 寻找最大覆盖时间点即可.
134. [ABC274G] Security Camera 3
tag: 二分图覆盖
trick: 最小表示增加约束防止贡献重复/增加好的性质, 图论覆盖转化为匹配, 网格图点转化为行和列的连接, 隐藏的二分图(网格图)
简要题意:
给定一张 \(H\) 行 \(W\) 列的网格图。设 \((i,j)\) 表示第 \(i\) 行第 \(j\) 列的位置,其中的字符 .
表示空白,#
表示障碍。
你可以在空白的位置放监控摄像头。监控有四个方向:前后左右。一个方向的监控只能看到自己正方向的位置。例如,向前的监控只能看到自己正前方的位置。
监控的视野会被障碍挡住。一个位置可以放多个监控。你需要求出最少的放置数量,使得所有的空白位置都能被看到。
\(1\le H,W\le 300\)。
题解:
考虑给最优解加一些约束.
首先显然的, 摄像头可以只放在边界和障碍旁边, 放在空地上可以平移到障碍旁边.
其次, 方向来说可以只要向左和向下两个方向, 这样的话, 每个空地就只能被两个位置的摄像头覆盖到.
考虑行列拆点拆成二分图. 对于每个节点把它所在的行摄像头和它所在的列摄像头之间连一条边, 问题就转化成了在二分图上选最少的点使得每个边都存在一端被选了.
最小覆盖=最大匹配, 跑网络流即可.
135. [ABC274G] Security Camera 3
tag: 概率期望
trick: 同时维护 \(x^0,x^1,x^2\) 的期望, 期望概率同时维护
简要题意:
给出一个 \(n\) 个点 \(m\) 条边的无向简单连通图,每个点有一个点权 \(C_i\in\{0,1\}\)。
\(\text{Takahashi}\) 初始时在 \(1\) 号点,等级为 \(0\)。接下来他要做 \(K\) 次如下操作:
- 随机地走向当前所在点的一个相邻点。
- 如果这个点 \(C_i=0\),将等级加一;如果这个点 \(C_i=1\),设 \(\text{Takahashi}\) 当前的等级为 \(X\),他可以获得 \(X^2\) 元钱。
求 \(K\) 次操作中 \(\text{Takahashi}\) 一共获得的钱数的期望,答案对 \(998244353\) 取模。
\((1\le n,m,K\le 3000)\)
题解:
考虑维护 \(f_{i,j,k}\) 表示走 \(j\) 步到 \(i\) 节点等级数 \(X^k\) 的期望和得分的期望, 转移即可.
136. [ABC281G] Farthest City
tag: 组合数学
trick: 图上到某一结点的距离在值域上连续, 末尾的权值作为状态, 贡献与某个量无关不必塞进状态
简要题意:
构造一张 \(N\) 个点的无向连通图,边权都是 \(1\)。记图中 \(1\) 到 \(u\) 的最短路径长度为 \(d_u\),你需要保证 \(\max\{d_1,d_2,...,d_{N-1}\}\) 严格小于 \(d_N\)。求构造方案数模 \(M\) 的值,方案区分节点编号。
\(N \leq 500\).
题解:
考虑 dp, 首先想象这个图是一个类似于分层图的结构.
设 \(f_{i,j}\) 表示已经安排了 \(i\) 个点, 最后一层是 \(j\) 个点的方案数.
虽然理论上应该是按照分层图层数从左到右递推, 但是由于贡献里面并没有这个东西, 所以状态里也不必有.
先选取是剩下的点里面哪 \(j\) 个, 然后再枚举和上一层的连边状态即可.
137. [ABC282G] Similar Permutation
tag: dp
trick: 对元素顺序有要求考虑插入 dp, 把目前已有的代价作为一维
简要题意:
长为 \(N\) 的排列 \(A\) 与 \(B\) 的相似度被定义为:
- 满足 \((A_{i+1}-A_i)(B_{i+1}-B_i)>0\),其中 \(1\le i<N\) 的 \(i\) 的数量。
求有多少对 \(1\sim N\) 的排列相似度恰为 \(K\),对 \(P\) 取模。
\(N \leq 100\).
题解:
考虑设 \(f_{i,j,p,q}\) 表示已经填了 \(i\) 个数, 已经有 \(j\) 个位置是相似的, 上面的数列最后一个位置在上面数列的排名是 \(p\), 下面的排名是 \(q\) 的方案数是多少, 考虑插入转移即可, 需要二维前缀和优化.
138. [ABC283F] Permutation Distance
tag: 二维偏序
trick: 对绝对值做分讨拆开, 把约束条件看成偏序去贡献, 曼哈顿距离最小生成树代价和是 \(O(n\sqrt n)\)
简要题意:
给定一个 \(1 \sim n\) 的排列 \(p = (p_1, p_2, \dots, p_n)\)。
你需要对每个 \(i\) 求得
一个 \(1\sim n\) 的排列是一个长为 \(n\) 的序列,满足 \([1, n]\) 内的所有整数恰好都在其中出现一次。
\(2\le n \le 2\times 10^5\)。
题解:
sol1:
考虑暴力做, 枚举每个点向左右找答案, 直到跨度已经比当前答案大为止, 后面的一定不会更新答案了, 因此总复杂度是 \(O(\sum ans_i)\).
这个东西是 \(O(n\sqrt n)\) 的, 证明如下: 考虑把每个点 \((x,y)\) 看成区间 \([x,y]\) 铺在区间上, 然后从初始每次花 \(1\) 的代价将区间伸缩一个单位, 求贯穿所有询问的复杂度. 考虑直接莫队, 复杂度就是 \(O(n \sqrt n)\).
sol2:
考虑画在坐标系上, 对绝对值做分讨, 共有四种, 其实就是分别向左上, 右上, 左下, 右下四个方向做贡献, 这样做四遍二维偏序即可,
139. [ABC283G] Partial Xor Enumeration
tag: 线性基
trick: 对二进制位二分答案, 线性基维护异或生成的集合
简要题意:
对于一个非负整数序列 \(a = (a_1, a_2, \dots, a_n)\),我们定义其的异或是一个非负整数 \(X\),使得对于任意非负整数 \(j\) 有 \(X\) 二进制的第 \(j\) 位为 \(1\) 当且仅当 \(a\) 中有奇数个元素满足二进制的第 \(j\) 位为 \(1\)。
给定一个 \(n\) 长度序列 \(A = (A_1, A_2, \dots, A_n)\)。令 \(\{s_1, s_2, \dots, s_k\}\ (s_1 < s_2 < \cdots < s_k)\) 为 \(A\) 的所有可空子序列的异或组成的集合。注意子序列不一定连续。
再给定两个整数 \(l, r\),请输出 \(s_l, s_l + 1,\dots, s_r\)。
\(1\le n \le 2\times 10^5, \ 0\le A_i < 2^{60},\ 1\le l \le r \le k, \ r - l \le 2\times 10^5\)。
题解:
总而言之, 线性基求第 \(k\) 大.
考虑枚举每个而二进制位能否取到即可.
140. [ABC284G] Only Once
tag: 组合计数
trick: 变更主元, 一个值域 \([1,n]\) 序列是一个个基环树森林, 组合数相邻项的比例关系
简要题意:
给定 \(n\),对于一个长度为 \(n\),值域为 \(n\) 的序列 \(A\),按如下方法构造无限序列 \(B_i(1 \le i \le n)\):
- \(B_{i,1} = i\)
- \(B_{i,j} = A_{B_{i,j-1}}(j > 1)\)
记 \(S_i\) 为 \(B_i\) 中只出现了一次的元素的个数,定义序列 \(A\) 的价值为 \(\sum_{i=1}^n S_i\),现在请求出所有 \(n^n\) 个可能的序列 \(A\) 的价值之和对 \(M\) 取模的结果。
\(n \le 2 \times 10^5, 10^8 \le M \le 10^9\).
题解:
首先观察到一个节点的贡献是它距离所在基环树的环的距离, 我们不妨枚举每个节点到环的每个距离的方案数, 这样就可以求答案了.
发现结点地位等价, 因此只需要枚举一个点到环的距离, 然后乘 \(n\) 即可.
我们考虑枚举这个环的大小, 那么一个节点的答案是 \(\sum_{s=1}^{n-1}\binom{n}{s}(s-1)!\sum_{d=1}^{n-s}\binom{n-s}{d-1}(d-1)!n^{n-s-d}\).
发现后边部分和 \(s\) 有关, 尝试递推后半部分:
递推 \(O(n)\) 计算即可.
141. [ABC286F] Guess The Number 2
tag: 构造, CRT
trick: 模意义方程组结果模数是方程组所有模数的最小公倍数
简要题意:
你需要构造一个长为 $m (1\leq m \leq 110) $ 的序列 \(A (1\leq a_i\leq m)\) 并将其输出,交互库会返回序列 \(B\) 满足 \(b_i=f^N(i)(1\le i\le m)\)(其中 \(f^1(i)=a_i\),\(f^N(i)=f(f^{N-1}(i))(N>1)\)),然后请你根据序列 \(B\) 得到正确的 \(N\)。
题解:
考虑你能做的实际上是构造一个同余方程组, 但是每个方程的模数之和不超过 \(110\), 你想让它们的最小公倍数超过 \(10^9\).
考虑构造 \(2,3,5,7,11,13,17,19,23\), 这样和是 \(100\), 乘积是 \(2\times 10^8\), 还远远不够, 但是我们可以微调, 把 \(2\) 换成 \(4\), \(3\) 换成 \(9\) 就够了.
142. [ABC286G] Unique Walk
tag: 欧拉路径, 并查集
trick: 并查集维护连通块
简要题意:
有一张 \(n\) 个点 \(m\) 条边的无向连通图,已知 \(k\) 条边为关键边,需要经过每条关键边恰好一次,非关键边无限制,判断能否满足条件。
题解:
考虑先不考虑关键边, 用剩下的边给原图并查集缩点, 因为剩下的边你可以随便跑, 接下来判断有没有欧拉路径就可以了.
143. [ABC287F] Components
tag: 树上背包
trick: 自身是否被占领作为状态, 把目前已有的代价作为一维
简要题意:
有一棵大小为 \(n\) 的树,节点编号 \(1\dots n\),从中任意选出一些点,显然有 \(2^n-1\) 种方案。每一种选法中选择的点都会形成一些连通块,对于 \(x=1\dots n\),求连通块数量恰好是 \(x\) 的选法数量,对 \(998244353\) 取模。
\(n \leq 5000\).
题解:
考虑设 \(f_{i,j,0/1}\) 表示在节点 \(i\) 子树内不算 \(i\) 所在连通块选了 \(j\) 个连通块, \(i\) 本身选没选的方案数. 背包转移即可.
144. [ABC287G] Balance Update Query
tag: 线段树二分
trick: 带修的二分考虑线段树二分, 值域过大的线段树考虑动态开点
简要题意:
有 \(n\) 种卡片, 每种卡片有两种属性: 价值\(A_i\) 和数目 \(B_i\), 要求支持 \(3\) 种操作
- 读入\((1, x, y)\), 将\(A_x\) 的数值改为 \(y\)。
- 读入\((2, x, y)\), 将\(B_x\) 的数值改为 \(y\)。
- 读入\((3, x)\), 输出在所有卡片中选择\(x\)张卡片的最大价值, 若\(\sum\limits_{i=1}^{n}B_i <x\), 则输出\(-1\)
题解:
考虑拍到值域上做线段树二分, 动态开点一下即可.
145. [ABC287G] Balance Update Query
tag: dp
trick: 能够知道当前元素和前面的元素产生多少贡献考虑插入 dp, 贡献与某个量无关不必塞进状态
简要题意:
商店里有 \(N\) 件商品,标号 \(1\sim N\),第 \(i\) 件商品有底价 \(A_i\) 且只有一件。
Takahashi 想要买其中的 \(M\) 件商品,分别是标号 \(X_1,X_2,\ldots,X_M\) 的商品。
他会按照以下的方式买东西:
若还剩 \(r\) 件商品没有购买过,选择一个符合 \(1\le j\le r\) 的 \(j\),付这件商品的底价加上 \(C_j\) 的钱购买其中标号第 \(j\) 小的商品。
求出买到它想要的商品所付的最小价钱。
注意他也可以买不想要的商品。
\(N \leq 5000\).
题解:
考虑购买每个元素组成的序列, 购买一个元素所花的钱就是它的底价加上原序列里面在他前面还比他小的元素个数所对应的 \(C_i\).
考虑对这个序列做填数 dp. 每一个元素填进去可以选择填在一个区间的位置里面, 这和上一个元素填在哪是无关的, 只和已经有多少个数有关, 因此我们设 \(f_{i,j}\) 表示考虑前 \(i\) 个物品, 已经填进去 \(j\) 个物品 (这里面的关键物品必须填) 的最小代价. 考虑填到第几个以及填不填去转移即可.
146. [ABC289F] Teleporter Takahashi
tag: 构造
trick: 反复关于 \(x\) 和 \(x+1\) 做对称就能平移一个点, 奇偶性判断是否有解, 横纵坐标分开考虑
简要题意:
在坐标系中有一个起始点 \((s_x,s_y)\) 和一个矩形 \(\{(x,y)|a-0.5\le x\le b+0.5,c-0.5\le x\le d+0.5\}\),每次操作可以选中一个矩形内的整点并把当前点移到与该点对称的位置,问能否在 \(10^6\) 次操作以内到达目标点 \((t_x,t_y)\)
如能请输出Yes
并给出任意一个方案,如不能输出No
给出的所有横纵坐标都是 \(\le 2\times10^5\) 的非负整数
题解:
首先发现横纵坐标独立拆开考虑.
先考虑一个 \(k\) 关于 \(x\) 对称变成 \(2x-k\), 再关于 \(x+1\) 对称变成 \(k+2\).
由此可见, 每次可以移动两格, 因此先判掉奇偶性带来的无解然后一点点平移就可以了.
147. [ABC289G] Shopping in AtCoder store
tag: 凸包
trick: 变更主元, 凸包求 \(y+kx\) 的最大值
简要题意:
给定 \(N\) 位顾客,\(M\) 件商品,每位顾客有一个购买意向 \(B_i\),每一件商品有一个价值 \(C_i\)。
设定每个商品的价格为 \(P_i\),一个顾客 \(i\) 会买一个商品 \(j\) 当且仅当 \(B_i + C_j \ge P_j\)。
对于每一个商品,设置价格 \(P_i\) 使销售额最大(销售额等于价格乘以购买人数),输出销售额。
\(1 \le N, M \le 2 \times 10^5\);
\(0 \le B_i , C_i \le 10^9\)。
题解:
首先按照 \(B_i\) 排序, 那么购买的顾客一定是一个前缀.
设我们想要让前 \(i\) 个顾客买东西, 那么我们获得的价值是 \(i(B_i+C)=iB_i+i \ C_j\).
\(iB_i\) 和 \(i\) 是固定的, 本质上就是每次给定 \(m\), 让求 \(\max y_i+mx_i\), 凸包维护即可.
148. [ABC290F] Maximum Diameter
tag: 构造, 组合计数
trick: 答案上界可以达到
简要题意:
对于一个长度为 \(n\) 的正整数序列 \(X=(X_1,X_2,\cdots,X_n)\),定义 \(f(X)\) 为:
- 对于所有节点数量为 \(n\),且点 \(i\) 的度数恰好为 \(X_i\) 的树,其直径的最大值。如不存在,则值为 \(0\)。
你需要对于所有长度为 \(n\) 的正整数序列 \(X\) 计算 \(f(X)\) 的和,可以证明其为有限值。答案对 \(998244353\) 取模。
\(T\) 组数据。\(1\le T\le2\times10^5\),\(2\le n\le10^6\)。
题解:
首先考虑一个序列的答案是什么.
首先要求 \(\sum d_i = 2n-2, \forall i, d_i > 0\), 否则价值为 \(0\).
其次, 考虑先把两个度数为 \(1\) 的节点放在两边, 然后再把所有不是 \(1\) 的串在中间, 再把剩下的节点挂在上面, 这样构造就可以认为一个序列的价值是非 \(1\) 数字数量加 \(1\).
考虑枚举有多少个非 \(1\) 数字, 考虑把序列所有元素 \(-1\), 那么意思就是 \(2n-2-n\) 分配给这么多位置的方案数, 这样就能列出答案式子.
用组合数恒等式优化一下即可.
149. [ABC290G] Edge Elimination
tag: 枚举, 贪心
trick: 变更主元, 贪心(极端值)
简要题意:
给定一颗满 \(K\) 叉树,深度为 \(D\),即整棵树有 \(1+K+K^2+\dots+K^D\) 个节点。
现在你可以选定若干条边并将其删除(也可以选择不删)。删除后将得到一个森林。求使森林中存在一棵树的节点数为 \(X\) 的最小删除边数。
$ 1\ \le\ T\ \le\ 100,1\ \le\ D, 2\ \le\ K , \displaystyle\ 1\ \le\ X\ \le\ \sum_{i=0}{D} Ki\ \le\ 10^{18} $
题解:
考虑枚举连通块的最高层在哪一层.
然后考虑, 从这一层向下扫, 每一个子树如果删了还能满足点数足够, 那么就删. 最后统计答案即可.
150. [ABC291Ex] Balanced Tree
tag: 点分治, 点分树
trick: 点分树上任意两点的 lca 在原树上在 \((u,v)\) 路径上, 点分树上每个节点都是它子树的重心
简要题意:
给你一棵树 \(T\),你要建一棵树 \(R\),使其满足以下性质:
- 任意两个点 \(x,y\) 在 \(R\) 中的最近公共祖先 \(z\) 在 \(T\) 中都位于 \(x,y\) 之间的简单路径上。
- 对于任意一个非根的节点 \(v\),以它为根的子树大小的两倍不得超过以它父亲为根的子树大小。
对于每个节点,输出它在 \(R\) 中父亲的编号,根节点输出 -1
。
题解:
我们不难发现这是棵点分树, 因此建树即可.
151. [ABC292G] Count Strictly Increasing Sequences
tag: dp, 字典树
trick: 字典树上每个子树也是区间, 区间扩张考虑去区间 dp, 末尾的权值作为状态
简要题意:
你有 \(n\) 个数,每个数长度为 \(m\)。
不过这 \(n\) 个数中,可能有某些位不确定,需要你在每个 ?
位置上 \(0\) 到 \(9\) 之间填一个数。设你填出来的序列是 \(\{S_i\}\)。
请你求出,在所有可能的填数方案中,有多少种满足 \(S_1 < S_2 < \dots < S_n\)?对 \(998244353\) 取模。允许前导零存在。
数据范围:\(n,m \le 40\)。
题解:
考虑从字典树的角度想, 如果建成字典树, 那么每一个结点的子树在原序列上都是一个区间, 于是考虑区间 dp, 设 \(f_{d,l,r,L,R}\) 表示 \([l,r]\) 这些字符串在深度 \(d\) 的节点处, 第 \(d\) 个字符取值区间 \([L,R]\) 的方案数, 前缀和转移即可.
152. [ABC292Ex] Rating Estimator
tag: 平均值, 线段树二分
trick: 平均值大于 \(k\) 转化为减 \(k\) 后前缀和大于 \(0\), 带修的二分考虑线段树二分
简要题意:
给定一个长度为 \(n\) 的序列 \(a_i\) ,参数 \(B\),询问数 \(q\);
每一次询问会对序列单点修改,你需要输出一个实数:
-
如果不存在某一个前缀平均值不低于 \(B\),则输出整体平均值;
-
否则,输出第一个不低于 \(B\) 的前缀平均值.
题解:
考虑靶序列所有元素减 \(B\), 则原条件转化为前缀和为正.
考虑单点修在前缀和上就是后缀加, 维护区间最大值考虑线段树二分即可.
153. [ABC293F] Zero or One
tag: 根号分治
trick: 根号分治, 变更主元
简要题意:
\(T\) 组数据,每组一个正整数 \(n\),保证 \(2\leq n \leq 10^{18}\) ,对于每个 \(n\) 求满足条件的 \(b\) 的个数,使得 \(n\) 的 \(b\) 进制表示只包含 \(0\) 或 \(1\).
题解:
首先考虑根号分治.
考虑如果进制位数比较小, 由于只有 \(0/1\), 因此可以 \(O(2^d)\) 枚举答案, 然后二分答案找到合适的 \(d\) 即可.
如果进制位数比较多, 那么合适的 \(d\) 不会很多, 那么枚举 \(d\) 即可.
寻找一个合适的分界点即可.
154. [ABC293G] Triple Index
tag: 莫队
trick: 发现询问支持加入和删除一个元素考虑莫队
简要题意:
给定长度为 \(N\) 的数列 \(a_1,a_2,\cdots,a_N\)。
\(q\) 组询问,每组询问给定 \(l,r\) 且\(1\le l\le r \le n\),问存在多少个三元组 \((i,j,k)\),使得 \(l\le i < j<k\le r\) 且 \(a_i=a_j=a_k\)。
题解略.
155. [ABC295E] Kth Number
tag: 期望
trick: 拆贡献(整体拆到元素), \(\sum_{i=1}^niP(x=i)=\sum_{i=1}^nP(x>\geq i)\)
简要题意:
给定长度为 \(n\) 的数列 \(a\) 与 \(m\),\(k\)。接下来,\(a\) 中所有为 \(0\) 的数将被等概率地替换为 \([1,m]\) 中的任意一个整数。接着将数列 \(a\) 从小到大排序。请你求出 \(a_k\) 的期望值,结果对 \(998244353\) 取模。
\(1\le k\le n\le2000\),\(1\le m\le 2000\)。
题解:
\(E(x)=\sum_{i=1}^niP(x=i)=\sum_{i=1}^nP(x>\geq i)\), 考虑模拟这个式子, 后面的概率用组合数算一下即可.
156. [ABC295F] substr = S
tag: dp
trick: 用 fail 来维护匹配状态, 拆贡献(整体拆到元素), 变更主元
简要题意:
有 \(T\) 组数据。
每组数据你会得到一个字符串 \(S\) 和两个整数 \(L,R\)。
我们定义 \(f(i)\) 表示 \(i\) 的十进制表示中有几个连续子串恰好等于 \(S\)。
求 \(\sum_{i=L}^R f(i)\)。
\(T \leq 10^3, |S| \leq 16, R \leq 10^{16}\).
题解:
sol1:
考虑拆贡献, 发现我们可以枚举某个起始点出现了 \(S\), 计数符合要求的数, 再累加也是对的.
sol2:
考虑数位 dp, 设 \(f_{i,j}\) 表示 算到第 \(i\) 位, 当前匹配状态是 \(j\) 的答案, 第二维的转移需要 kmp 的 fail 指针.
157. [ABC295G] Minimum Reachable City
tag: 并查集
trick: 并查集跳过无用元素, 并查集维护连通块
简要题意:
给定一张点数为 \(N\) 的有向图,初始 \(p_i(1\leq p_i \leq i,1 \leq i < N)\) 连向 \(i+1\)。
\(Q\) 次操作,有两种:
1 u v
:\(u\) 向 \(v\) 连一条有向边,保证最开始时 \(v\) 能到达 \(u\),\(u \ne v\)。2 x
:询问 \(x\) 能到达的点中编号最小的点。
题解:
一开始相当于给出了一棵树, 每次加入一条返祖边, 会把一条链上的点加入到一个强连通分量中.
考虑到有效的 merge 操作只会有 \(n-1\) 次, 因此我只需要高效的找到有效的 merge 即可.
这个过程可以考虑并查集加速跳.
159. [ABC296G] Polygon and Points
tag: 凸包
trick: 二分法求直线和凸包的交点, 用交点法反应点和凸壳的位置关系
简要题意:
在平面直角坐标系上给定一个 \(n\) 个点的凸多边形,顶点均为整点,并按照逆时针顺序给出。
接下来有 \(Q\) 个询问,每个询问给出一个整点,输出其是在多边形内部、外部或是边上。
题解:
考虑从这个点引出水平直线和凸壳求交点即可.
求交点的方法是首先把凸壳拆成纵坐标单增和单减两部分, 然后二分即可.
160. [ABC297F] Minimum Bounding Box 2
tag: 期望
trick: 拆贡献(期望拆到概率), 拆贡献(整体拆到元素), 简单容斥, 正难则反
简要题意:
在一个 \(H\) 行 \(W\) 列的网格图上随机选择 \(K\) 个点。定义当前局面的分数为最小的可以围住这 \(K\) 个点的水平竖直方向矩形的面积。
请求出所有局面中分数的期望值,输出时对 \(998244353\) 取模。
题解:
考虑拆到每个点是否被包含.
考虑正难则反, 不包含就意味着关键点都在某个方向上, 但是依然不好计数, 那就上下左右化并为交容斥即可.
161. [ABC299G] Minimum Permutation
tag: 贪心, 字典序, 单调栈
trick: 贪心(字典序), 寻找字典序最小的序列用单调栈
简要题意:
给定一个长度为 \(N\) 的序列 \(A\),由 \(1\) 到 \(M\) 之间的整数组成。其中,\(1\) 到 \(M\) 每个数至少出现一次。
找到一个长度为 \(M\) 的 \(A\) 的子序列,使得这个子序列中 \(1\) 到 \(M\) 恰好出现一次,输出满足条件的字典序最小的子序列。
题解:
从前到后跑一遍单调栈, 弹栈的过程能自动让字典序最小.
162. [ABC300G] P-smooth number
tag: dfs
trick: 数据范围较小考虑爆搜, 从可能性较少的位置向较多的位置搜, 记忆化搜索优化, meet-in-the-middle处理总状态不多的搜索
简要题意:
一个正整数被称为“\(k\) 阶平滑数”,当且仅当它的任意一个素因子不超过 \(k\)。
给定正整数 \(N\) 和素数 \(P\)。问不超过 \(N\) 的“\(P\) 阶平滑数”有多少个。
\(N \leq 10^{16},P \leq 100\).
题解:
sol1
考虑爆搜剪枝. 设 \(f_{i,j}\) 表示搜到 \(i\) 后到第 \(j\) 个质数的答案, 当 \(i\) 比较小的时候做记忆化, 并且倒着搜就能过了.
sol2
考虑总状态不多, 不如左右分别搜, 中间合并.
163. [ABC303F] Damage over Time
tag: 贪心
trick: 贪心(极端值), 基于单调性的双指针, 把 dp 的一维二分答案掉
简要题意:
有一只血量为 \(H\) 的怪兽,你现在要攻击它。你有 \(N\) 种方式可以攻击它。
如果你在时间 \(j\) 用了第 \(i\) 种方式攻击,那么在时间 \(j,j+1,\cdots j+t_i-1\),它都会受到 \(d_i\) 点伤害。
问最少需要花多少时间才能使怪兽的血量不高于 \(0\)。
题解:
考虑每一步都贪心的选当前能够造成伤害最大的, 但是并不好判断那个伤害能打出来多少秒.
于是考虑先枚举答案时间, 答案有单调性因此可以二分不用枚举, 这样的话就能够判断每个时刻每个法术能打出来多少伤害, 贪心选最大即可.
每个法术的伤害含有 \(\min\) 不好维护,但是这个 \(\min\) 取哪边关于时刻单调, 考虑动态维护这个转变指针维护即可.
164. [ABC303G] Bags Game
tag: dp, 单调队列
trick: 区间扩张考虑去区间 dp, dp优化(单调队列)
简要题意:
Takahashi(先手)和 Aoki(后手)在玩游戏。他们有无限的钱,从左到右一共有 \(N\) 个物品,第 \(i\) 个价值 \(x_i\),两个人轮流操作,每次轮到的一个人可以做 \(3\) 种操作之一(假设还剩下 \(n\) 个物品)。
- 拿走最左边或者最右边的物品。
- 付给 Snuke \(A\) 块钱,然后重复以下操作 \(\min(B,n)\) 次:拿走最左边或者最右边的物品。
- 付给 Snuke \(C\) 块钱,然后重复以下操作 \(\min(D,n)\) 次:拿走最左边或者最右边的物品。
定义一个人的最大收益是拿到的所有东西的价值之和减去付给 Snuke 的钱数。
请问如果 \(2\) 个人都使用最优策略,使得自身的收益减去对方的收益尽量的大,那么最终 Takahashi 的收益减去 Aoki 的收益会是多少?
- \(1\le B,D\le N\le 3000,A,C\le 10^9\)
题解:
考虑在任意时刻, 剩下来的部分都是一个区间, 因此考虑从区间 dp, 设 \(f_{i,j}\) 表示剩下来 \([i,j]\) 这段区间的答案.
决策免费拿一个是好做的, 而另外两种决策都需要决策从前缀和后缀拿走若干物品, 但是发现查询的区间是定长的, 而且有单调性, 那么考虑滑动窗口即可.
165. [ABC305G] Banned Substrings
tag: dp, AC自动机, 状态压缩
trick: AC 自动机维护与多个模式串的匹配状态, 末尾的权值作为状态, dp优化(矩阵快速幂)
简要题意:
给定一个由 \(M\) 个长度不超过 \(6\) 的仅由字母 \(\texttt a\) 和 \(\texttt b\) 组成的非空字符串集合 \(S=\{s_1, s_2, ..., s_M\}\)。
求有多少个字符串 \(T\) 满足以下条件:
- 长度为 \(N\) 且仅由字母 \(\texttt a\) 和 \(\texttt b\) 组成。
- 对于任意 \(s_i\in S\),\(T\) 中不包含 \(s_i\) 作为连续的子串。
由于答案可能很大,所以对 \(998244353\) 取模。
\(1\leq N\leq 10^{18}\)
\(1\leq M\leq 126\)
题解:
sol1:
考虑用 AC 自动机维护匹配状态, 设 \(f_{i,j}\) 表示用了 \(i\) 个字母, 匹配状态是节点 \(j\) 的方案数.
矩阵快速幂加速转移即可.
sol2:
考虑下一步合不合法只和末尾的 \(5\) 个字母有关系, 因此考虑设 \(f_{i,S}\) 表示 \(i\) 个字母末尾是 \(S\) 的方案数, 矩阵快速幂加速转移即可.
166. [ABC307F] Virus 2
tag: 图论, 最短路
trick: 最优性剪枝/保证枚举合法保证复杂度, 变更主元, 到一些点的最短距离考虑多源最短路
简要题意:
有一张 \(n\) 个点 \(m\) 条边的无向图,每个点都有一个人。起初(第 \(0\) 天),其中 \(k\) 个点 \(a_1,a_2,a_3,\cdots,a_k\) 上的人被感染了病毒。再接下来的 \(d\) 天中,病毒将以以下方式传播:
- 在第 \(i−1\) 天结束时感染病毒的人,在第 \(i\) 天结束时仍然感染。
- 在第 \(i\) 天,所有与前 \(i-1\) 天已经被感染的人的最短距离不超过 \(x_i\) 的人会被感染。
对于每个 \(i(1\le i \le n)\),求第 \(i\) 个人被感染的时间,若 \(d\) 天内一直未被感染,则输出 -1
。
题解:
考虑维护所有合法点和不合法点之间的连边, 每次传染考虑枚举这当中小于 \(x_i\) 的, 这些一定是有效的传染边, 以它们的端点为起点做多源最短路, 这样的话, 枚举的所有边下次都不会被枚举到, 复杂度 \(O(m\log n)\).
167. [ABC307G] Approximate Equalization
tag: dp
trick: 把目前已有的代价作为一维
简要题意:
给定一个长度为 \(n\) 的序列 \(a\),你可以:
- 选择 \(1\leq i<n\),令 \(a_i\) 减去 \(1\)、\(a_{i+1}\) 加上 \(1\)。
- 选择 \(1\leq i<n\),令 \(a_i\) 加上 \(1\)、\(a_{i+1}\) 减去 \(1\)。
你要让 \(a\) 中任意两个数相差不超过 \(1\),输出最少步数。
题解:
显然最后答案会有 \(a\) 个 \(x\) 和 \(n-a\) 个 \(x+1\), 而显然 \(a,x\) 的值都可以直接算出来, 那么就可以设计背包 dp \(f_{i,j}\) 表示前 \(i\) 个数有 \(j\) 个 \(x+1\) 的最小代价.
168. [ABC308G] Minimum Xor Pair Query
tag: dp
trick: 把目前已有的代价作为一维, trie 树维护最大异或数对 \(O(n \log V)\) , trie 树维护一个固定数和其他数的最大异或值 \(O(\log V)\), 带删除转化为不带删除用线段树分治, 对于 \(a<b<c\) 有 \(\max(a\oplus b,b\oplus c) < a\oplus c\)
简要题意:
这里有一块你可以写整数的黑板,初始黑板上什么都没有。
现在有 \(q\) 个操作/询问,格式如下:
- 操作
1 x
:在黑板上写下一个数 \(x\)。 - 操作
2 x
:将一个整数 \(x\) 从黑板上擦去,保证此时黑板上至少有一个整数 \(x\)。 - 询问
3
:输出黑板上任意两个整数的异或值的最小值,保证此时黑板上至少有两个数。
题解:
sol1:
考虑暴力维护, 字典树可以增量查询, 于是考虑线段树分治下来就可以了.
sol2:
考虑性质, \(a\leq b \leq c\) 时有 \(\min(a\oplus b, b\oplus c) <a \oplus c\), 因此只需要考虑相邻数的异或值, 于是只要用 set 维护一下即可.
169. [ABC310F] Make 10 Again
tag: 状态压缩, dp
trick: 概率转化为方案数, dp(状态压缩)
简要题意:
你有 \(N\) 个骰子和一个序列 \(A_i\),第 \(i\) 个骰子能等概率掷出 \(1 \sim A_i\) 的点数。
在同时掷出 \(N\) 个骰子后,求下面所述的条件被满足的概率模 \(998,244,353\) 的值:
能够选出这些骰子的一个子集,使得子集内的骰子掷出的点数和为 \(10\)。
保证 \(1 \le N \le 100\),\(1 \le A_i \le {10}^6\)。
题解:
考虑维护前 \(i\) 个骰子能组合出的数的集合, 用状压 dp 维护, 设 \(f_{i,S}\) 表示状态, 暴力转移即可.
170. [ABC311F] Yet Another Grid Task
tag: dp
trick: 变更主元, 末尾的权值作为状态
简要题意:
我们说一个 \(N \times M\) 的矩阵是「美丽的」,当且仅当:
- 如果 \((i, j)\) 是黑色的,且 \((i + 1, j)\) 是存在的,那么 \((i + 1, j)\) 也应是黑色的。
- 如果 \((i, j)\) 是黑色的,且 \((i + 1, j + 1)\) 是存在的,那么 \((i + 1, j + 1)\) 也应是黑色的。
Takahashi 可以让任意多个白色的方格变成黑色的,求他一共可以构造出多少种不同的美丽的矩阵,结果对 \(998244353\) 取模。
对于输入的矩阵,.
表示白色,#
表示黑色。
$ 1\ \le\ N,M\ \le\ 2000 $
题解:
我们不妨从每一列考虑, 考虑每一列被涂色的高度, 那么显然有 \(h_i\geq h_{i-1}-1\),
那么设 \(f_{i,j}\) 表示考虑前 \(i\) 列, \(h_i=j\) 的方案数. 前缀和优化转移即可.
171. [ABC312E] Tangency of Cuboids
tag: 枚举
trick: 变更主元
简要题意:
给定三维空间中的 \(n\) 个长方体,每个长方体以其一条体对角线的两个端点的坐标形式给出,即对于每一个长方体 \(i\),给定其体对角线端点的坐标 \((x_{i,1},y_{i,1},z_{i,1})\) 和 \((x_{i,2},y_{i,2},z_{i,2})\)。
要求对于给定的每一个长方体,求出给定的其它长方体中,与其共享一个面的长方体数量。
具体地说,对于每个 \(i(1 \le i \le n)\),找到 \(1≤j≤n\) 且 \(j≠i\) 的 \(j\) 的数量,使得第 \(i\) 个长方体和第 \(j\) 个长方体的表面有一个正面积的交集。
题目保证每个长方体两两不交,即对于任意两个长方体,它们的交集体积为 \(0\)。
- $ 1\ \leq\ N\ \leq\ 10^5 $
- $ 0\ \leq\ X_{i,1}\ <\ X_{i,2}\ \leq\ 100 $
- $ 0\ \leq\ Y_{i,1}\ <\ Y_{i,2}\ \leq\ 100 $
- $ 0\ \leq\ Z_{i,1}\ <\ Z_{i,2}\ \leq\ 100 $
题解:
注意到坐标范围比较小, 那么直接枚举坐标范围内的每一个小立方体, 再枚举其六个联通位置统计答案即可.
172. [ABC312Ex] snukesnuke
tag: 枚举
trick: 用 border 反映周期, 答案有倍数约束有上界保证考虑调和级数
简要题意:
高桥君需要给 $ N $ 个人取一个绰号。
第 $ i $ 个人希望将其绰号设为 $ S_i $。为了避免给多个人取相同的绰号,高橋君决定采用以下步骤为这 $ N $ 个人分别确定绰号:
- 对于 $ i=1,\ldots,N $,按以下步骤来确定第 $ i $ 个人的绰号:
- 将变量 $ k_i $ 设为 $ 1 $。
- 当“将 $ S_i $ 重复 $ k_i $ 次得到的字符串”已经是某人的绰号时,不断增加 $ k_i $ 的值,直到找到一个没有被使用过的绰号。
- 将“将 $ S_i $ 重复 $ k_i $ 次得到的字符串”设为第 $ i $ 个人的绰号。
请计算出确定了 $ N $ 个人的绰号后的 $ k_1,\ldots,k_N $。
\(\sum |S_i| \leq 2\times 10^5\).
题解:
首先考虑什么样的两个串会相互影响.
发现当两个串周期一致时, 它们会互斥. 于是考虑把周期一样的分开处理.
问题转化为: 你要维护一个 set
, 每次修改给出一个数 \(x\), 你要找到最小的 \(x | d\) 使得 \(d\) 不属于 set
, 然后把 \(d\) 加入 set, \(\sum x \leq 2\times 10^5\).
这个问题首先考虑答案上界不会太大, 实际上不会超过 \(\sum x\), 然后考虑使用调和级数暴力枚举, 但是这要求枚举的元素各不相同, 这只需要完全一样的串就继续向下枚举, 不需要重复枚举就能实现.
173. [ABC314G] Amulets
tag: 堆
trick: 对顶堆模拟线段树二分, 贪心(极端值)
简要题意:
有 \(N\) 个怪物,编号为 \(1\) 至 \(N\).编号为 \(i\) 的怪物有一个正整数攻击力 \(A_i\) 和一个 \(1\) 至 \(M\) 之间的类型 \(B_i\).
你的初始血量为 \(H\),并且有 \(M\) 个不同的护符,编号为 \(1\) 至 \(M\).
每次冒险中,你都要从 \(M\) 个护符中选择若干个携带,然后按照编号从 \(1\) 到 \(N\) 依次对战每一只怪物.在对战怪物 \(i\) 时,如果你没有携带护符 \(B_i\),你的血量会扣 \(A_i\) 点.若此时血量小于等于 \(0\) 你会死亡,否则视为你击败了怪物.
你需要对于每个整数 \(K=0,1,\dots,M\),求出携带恰好 \(K\) 个护符时,在不死亡的前提下能击败的最多怪物数量.每次冒险相互独立.
保证对于每个 \(i=1,2,\dots,M\),至少有一个类型为 \(i\) 的怪物.
题解:
首先考虑我们带哪些护符. 对于一个时间刻 \(i\) 而言, 我们设在这之前的类型为 \(i\) 的怪兽打出来的总伤害 为 \(f_i\), 那么最优策略显然是挑选最小的几个 \(i\) 不带, 然后看看这些不带的是否大于 \(H\).
做法就是在值域上维护整个 \(f\) 数组, 要求支持单点插入, 单点删除, 找到最短的前缀和大于 \(H\) 的前缀.
第三个约束是线段树二分, 但是可以用对顶堆模拟, 类似于堆求第 \(k\) 大的数的作法, 始终维持一个堆处于边界条件并且大于另一个堆.
174. [ABC315G] Ai + Bj + Ck = X (1 <= i, j, k <= N)
tag: 枚举
trick: 减少变量
简要题意:
给定 \(n,a,b,c,x\),求满足 \(1 \le i,j,k \le n\) 且 \(ai+bj+ck=x\) 的三元组 \((i,j,k)\) 的个数。\(1 \le n \le 10^6\),\(1 \le a,b,c \le 10^9\),\(1 \le x \le 3 \times 10^{15}\)。
题解:
考虑枚举 \(i\), 剩下两个数用 exgcd 处理一下即可.
175. [ABC317F] Nim
tag: 异或, dp
trick: dp(按数位从前向后), 把目前已有的代价作为一维, 多个数同时数位 dp, 倍数约束条件弱化为余数条件
简要题意:
给定四个正整数 \(N,A_1,A_2,A_3\),试求满足一下条件的三元组 \(\left(X_1,X_2,X_3 \right)\) 的个数,对 \(998244353\) 取模。
- \(1 \le X_i \le N,i=1,2,3\)。
- \(A_i \mid X_i\),\(i=1,2,3\)。
- \(\left(X_1 \bigoplus X_2 \right) \bigoplus X_3=0\)。
\(N \leq 10^{18}, A_i \leq 10\).
题解:
考虑数位 dp, 设 \(f_{i,{j_k}}\) 表示三个数填到第 \(i\) 位, 对 \(A_k\) 分别取模后的值是 \(j_k\), 转移时注意下异或和就可以了.
176. [ABC318F] Octopus
tag: 分界点
trick: 如果分界点不多考虑枚举每一段中的代表元素求答案
简要题意:
有个机器人,它有 \(N\) 个手臂,第 \(i\) 个手臂长度为 \(L_i\)。同时有 \(N\) 个宝藏,第 \(i\) 个宝藏的坐标是 \(X_i\)。
当机器人位于 \(k\) 时,它的第 \(i\) 条手臂可以够到 \([k-L_i,k+L_i]\) 范围内的宝藏。
机器人的每条手臂只能选择一个宝藏。请问总共有多少个整数坐标,能够让机器人在这个坐标能够拿到所有宝藏?
$ 1\ \leq\ N\leq\ 200 $
题解:
这显然是个区间上的问题, 考虑对每个连续段统计贡献.
对于每个手和每个宝藏, 都有左右两个临界位置, 因此有 \(O(n^2)\) 个连续段. 对每个连续段分别暴力求答案, 总复杂度 \(O(n^3)\).
177. [ABC318G] Typical Path Problem
tag: 网络流
trick: 有容量限制的点考虑拆点, 最大流较小的网络复杂度较低
简要题意:
给出一个有 \(n\) 个顶点和 \(m\) 条边的无向连通图 \(G\),没有重边和自环。
顶点的编号为 \(1 \sim n\),边的编号为 \(1 \sim m\),第 \(i\) 条边连接顶点 \(u_i\) 和 \(v_i\)。
给出图上三个不同的顶点 \(A,B,C\)。判断是否有从点 \(A\) 经过点 \(B\) 到点 \(C\) 的简单路径。
简单路径指路径上的点互不相同,即不重复经过同一个点。
\(3 \le n \le 2 \times 10^5\)
题解:
考虑网络流, 原题相当于从 \(B\) 求到 \(A,C\) 的不相交路径, 拆出入点即可.
178. [ABC319G] Counting Shortest Paths
tag: 最短路
trick: 边数爆炸依然可以 bfs, 枚举删掉的边数最短路, 删掉一些边相当于每个点连一些区间
简要题意:
给定你一张 \(N\) 个点的完全图和 \(M\) 条边,表示将该完全图中的这 \(M\) 条边删除,让你求出删完后的点 \(1\) 到点 \(N\) 最短路径条数,如果不存在,输出 -1
。
数据范围:\(2\le N \le 2\times10^5,0\le M \le \min(2\times 10^5,\frac{N\cdot (N-1)}{2})\)
题解:
sol1:
考虑删掉一些边相当于每个点连向一些区间, 那么用线段树优化建图即可.
sol2:
考虑维护一个集合 \(S\) 表示没有遍历到过的点, bfs 的过程中先枚举 \(S\) 中的点, 再判断有没有边就是对的了.
对于最短路计数, 发现 \(ans_u=\sum_{dis_v=dis_u-1}ans_v-\sum_{(u,v)\not\in E,dis_v=dis_u-1} ans_v\), 这样递推复杂度也就是对的了.
179. [ABC320F] Fuel Round Trip
tag: dp
trick: 前后回文位置有约束就考虑从中间向两边填, 末尾的权值作为状态
简要题意:
您正计划从坐标 \(0\) 移动到数轴上的坐标 \(X_N\),然后转身返回坐标 \(0\)。您只能在去时向正方向移动,在返回时向负方向移动。
你将开车旅行。这辆汽车每行驶一公里就消耗一升燃油。你可以携带 \(H\) 升的燃油,没有燃油就无法移动。
对于每个 \(i=1,2,...,N−1\),在坐标 \(X_i\) 有一个加油站,在那里你可以用 \(P_i\) 元获得 \(F_i\) 升的燃料。但是,携带的燃油不能超过 \(H\) 升。更确切地说,如果你有 \(x\) 升的燃料,并使用坐标 \(X_i\) 的加油站,你必须支付 \(P_i\) 元,你的燃料量变成 \(\min(x+F_i,H)\) 升。往返期间,每个加油站最多可使用一次。
如果计划能够实现,输出所需的最低金额,否则输出 -1
。
$ 1\ \leq\ N,\ H\ \leq\ 300 $
题解:
设 \(f_{i,j,k}\) 表示从 \(n\) 填了 \(i\) 个位置, 目前来之前的油量是 \(j\), 返回时油量是 \(j\). 转移即可.
180. [ABC321G] Electric Circuit
tag: dp
trick: dp(状态压缩), 恰好是一个整体的方案数用是多个整体并集来容斥
简要题意:
考虑设 \(f_S\) 表示 \(S\) 集合内的元素是多个连通块并的方案数, 考虑有解当且仅当这里面的元素在 \(a_i\) 和 \(b_i\) 中出现次数一致, 而方案数由于可以随便选, 因此方案数就是这个次数的阶乘,
然后考虑设 \(g_S\) 表示 \(S\) 集合内的元素刚好是一个连通块的方案数, 容斥一下即可.
181. [ABC311G] One More Grid Task
tag: 单调栈
trick: 找下一个比自己小的用单调栈, 减少变量
简要题意:
给你一个 \(n\times m\) 的矩阵 \(a\),求:
$ 1\ \le\ N,M\ \le\ 300 $
题解:
考虑枚举上下边界, 这样的话不难发现可以把一列的元素压在一起考虑变成一维问题, 用单调栈找一下每个元素做最小值的最大区间即可.
182. [ABC325G] offence
tag: dp
trick: 每次消除一个区间考虑区间 dp
简要题意:
给你一个字符串 \(S\)。请找出对字符串 \(S\) 执行下列操作 \(0\) 次或 \(0\) 次以上所得到的字符串的最小长度。
- 在字符串中选择一个连续出现的
of
和一个介于 \(0\) 和 \(K\) 之间的整数 \(i\)。然后,从字符串中删除选中的of
和其后面的 \(i\) 个字符。
\(n \leq 300\).
题解:
考虑区间 dp, 设 \(f_{l,r}\) 表示 \([l,r]\) 上的答案, 转移考虑枚举左端点删不删即可.
183. [ABC326F] Robot Rotation
tag: 背包
trick: 横纵坐标分开考虑, 超大值域背包
简要题意:
一个机器人位于坐标平面的原点,坐标平面的正 \(x\) 轴指向右侧,正 \(y\) 轴指向上方。最初,机器人面向 \(x\) 轴正方向。
您将依次对 \(i=1,\ldots,N\) 执行以下操作。
- 将机器人顺时针或逆时针旋转 \(90\) 度。然后,机器人沿着它所面对的方向向前移动 \(A_i\) 个单位。
能否选择旋转方向,使机器人在进行\(N\)操作后位于坐标 \((X,Y)\) 处?
如果可以,请确定每次操作应选择顺时针还是逆时针方向。
$ 1\ \leq\ N\ \leq\ 80 $
题解:
考虑你每次的方向都要转, 这意味着奇数次一定在走 \(x\) 轴, 偶数次一定在走 \(y\) 轴, 那么发现没有后效性直接拆开做.
考虑在一个方向上1相当于是一个背包, 但值域很大, 两边爆搜即可.
184. [ABC327F] Apples
tag: 扫描线
trick: 基于单调性的双指针
简要题意:
在数轴上有若干苹果树,从这些苹果树上落下了共 \(N\) 个苹果。第 \(i\) 个苹果在 \(T _ i\) 时刻落在了 \(X _ i\) 位置。
Takahashi 有一个耐久为 \(D\)、长度为 \(W\) 的篮子,他需要执行以下操作恰好一次。
选择两个正整数 \(S\) 和 \(L\),用篮子在 \(S - 0.5\) 时刻覆盖数轴上 \([L - 0.5, L + W - 0.5]\) 的范围,并在 \(S + D - 0.5\) 时刻撤走篮子。他会得到这段时间内落在篮子覆盖范围内的所有苹果。
篮子只能放置一次,且放置好后便不可再移动。求 Takahashi 能得到的苹果数量的最大值。
题解:
翻译一下就是现在有二维平面上一些点, 你有一个固定长宽, 只能横着放的矩形, 问最多覆盖多少个点.
考虑扫描线, 但上面扩展时下面跟着删点就行了. 需要一颗支持区间加减求全局最大值的线段树.
185. [ABC328G] Cut and Reorder
tag: dp
trick: dp(状态压缩), \(2^n\) 个状态的全 \(0\) 子段数量和 \(O(n2^n)\)
简要题意:
考虑设 \(f_{i,S}\) 表示考虑原序列前 \(i\) 个元素, 已经填好了目标元素 \(S\) 内的位置的最小代价, 转移时直接枚举连续段即可.
\(2^n\) 个状态的全 \(0\) 子段数量和 \(\sum_{k=1}^n2^{n-k}(n-k+1)=O(n2^n)\), 因此暴力做就是对的.
186. [ABC332E] Lucky bag
tag: 方差, dp
trick: dp(状态压缩), 方差等于平方的平均值减平均值的平方
简要题意:
你有 \(n\) 个物品,第 \(i\) 种物品重量为 \(w_i\),将这些物品全部分到 \(D\) 个盒子中,每个盒子的重量为其中物品重量之和,求盒子重量的方差最小值,答案误差在 \(10^{-6}\) 之内。
允许存在盒子没有物品,此时其重量为 \(0\) 。
\(2\leq D\leq n\leq15\)
题解:
方差等于平方的平均值减掉平均值的平方.
根据题意得到, 平均值的平方是固定的, 那么只要最小化平方和即可.
直接考虑状压 dp 即可.
187. [ABC332F] Random Update Query
tag: 期望
trick: 拆贡献(多步后的期望拆到每一步), 线段树支持区间乘区间加
简要题意:
给定一个长度为 \(N\) 的数组和 \(M\) 次操作,每次操作会给出三个整数 \(L, R, X\),你要从 \(L\) 到 \(R\) 中等概率的选一个数 \(p\) 并将 \(a_p\) 替换成 \(X\)。问最后每个数的期望值。
题解:
维护每一步后每个数的期望值.
如果对 \([l,r]\) 操作, 那么这里面的每个数 \(x\) 有 \(r - l + 1\) 的概率变为 \(X\), 否则不变.
因此用线段树支持区间乘区间加即可.
188. [ABC333F] Bomb Game 2
tag: 概率
trick: dp维护式子系数
简要题意:
有 \(n\) 个人排成一排。你需要进行若干次操作,直到只剩下一个人:
- 有 \(\dfrac 12\) 的概率,将第一个人刀了;
- 否则,把第一个人挪到最后,其余人的位置向前移。
对于每个 \(1 \le i \le n\),求出第 \(i\) 个人最终活下来的概率。
$ 2\leq\ N\leq\ 3000 $
题解:
考虑设 \(f_{i,j}\) 表示总共有 \(i\) 个人, 第 \(j\) 个人活下来的概率, 模拟转移即可, 但是转移有环, 那么就把每行第一个元素设成未知数, 每个状态储存一次函数, 然后列方程解出来即可.
189. [ABC334F] Christmas Present 2
tag: 单调队列
trick: 把各部分贡献列成式子再观察
简要题意:
圣诞老人 Santa 住在一个二维平面的小镇上,镇上住着 \(N\) 个小朋友,按 \(1 .. N\) 的顺序标号,第 \(i\) 个小朋友的家在坐标 \((X_i,Y_i)\) ,圣诞老人的家在坐标 \((S_X, S_Y)\)。
圣诞老人想按 \(1\) 到 \(N\) 的顺序给每个小朋友送礼物,但是他一次性只能最多带 \(K\) 个礼物。如果礼物不够,Santa 就要返回自己家补充礼物。
请你求出 Santa 离开家并给所有小朋友送完礼物,最后回到自己家的最短路程。
本题有 SPJ,输出的值与答案的差的绝对值不超过 \(10 ^ {-6}\) 视为正确。
第一行输入 \(N,K\),第二行输入 Santa 的坐标,接下来 \(N\) 行描述小朋友的坐标。
题解:
由于只能按顺序完成, 因此无后效性, 设 \(f_i\) 表示把前 \(i\) 个完成的最小代价, 则有:
能提出来的1提出来之后单调队列优化即可.
190. [ABC334G] Christmas Color Grid 2
tag: tarjan
trick: 割点会断开连通块
简要题意:
给定 \(n\times m\) 的字符矩阵,#
表示绿色,.
表示红色。
均匀随机一个绿色块换成红色,求绿色四连通块的期望数量,对 \(998244353\) 取模。
\(1\le n,m\le 1000\)
题解:
孤立点删掉答案减 \(1\), 割点删掉答案加 \(1\).
找找个数即可.
191. [ABC335F] Hop Sugoroku
tag: dp, 根号分治
trick: 对跨度根号分治
简要题意:
有一排有 \(N\) 个方格,还有一个长度为 \(N\) 的序列 \(A\)。开始时,第一个方格被染成黑色,其他的方格为白色,并在第一个方格放上一个物品。
你可以进行若干次操作,操作如下:
- 当物品在方格 \(i\) 的时候,可以任意选择一个正整数 \(x\),并将物品移动到方格 \(i+A_i \times x\) 上,方格 \(i+A_i \times x\) 染成黑色。
求操作结束时,可以涂成黑色的可能方格集的数量,答案对 \(998244353\) 取模。
题解:
倒过来 dp, 就有 \(f_i=\sum_{f_{i+kA_i}}\), 对这个跨度作根号分治即可.
192. [ABC336E] Digit Sum Divisible
tag: dp
trick: dp(按数位从前向后)
简要题意:
定义一个正整数的数位和为其十进制下每个数位的数字的和,如 \(2024\) 的数位和为 \(2+0+2+4=8\)。
一个正整数 \(n\) 被称为好数当且仅当 \(n\) 是它的数位和的倍数。
给定 \(N\),求 \([1,N]\) 中好数的个数。\(1\le N\le 10^{14}\)。
$ 1\ \leq\ N\ \leq\ 10^{14} $
题解:
这种问题状态里会有余数, 但是这道题并不知道余数是多少, 于是枚举数位和即可.
考虑设 \(f_{i,j,k}\) 表示当前数位和是 \(j\), 当前数对枚举值的余数是 \(k\) 的方案数.
193. [ABC336F] Rotation Puzzle
tag: 搜索
trick: meet-in-the-middle处理总状态不多的搜索
简要题意:
gsczl71 有一个 \(H\) 行,\(W\) 列的二维数组。
每一次选择一个 \(H-1\) 行,\(W-1\) 列的连续矩阵,将其旋转 \(180\) 度。
目标:对于所有 \(1 \le i \le H,1 \le j \le W\),使得单元格 \((i,j)\) 中包含整数 \(\left(\left(i-1\right) \times W+j\right)\)。
你有最多 \(20\) 次操作机会,问你最少操作多少次?
若不可以达到要求,输出 -1
。
题解:
考虑一次操作只有 \(4\) 种可能, 有 \(20\) 次操作次数, 那么考虑 meet in the middle 双向广搜即可.
194. [ABC337F] Usual Color Ball Problems
tag: 破环为链
trick: 破环为链后考虑滑动窗口添加删除首尾元素的影响
简要题意:
你现在手上有 \(n\) 个排成一列的球、 \(m\) 个盒子。每个球有一种颜色。
现在你需要对于每个 \(0\le x< n\),执行以下操作:
- 将第一个球移动至序列末尾。该操作将执行 \(x\) 次。
- 从前往后处理每个球,假设当前球的颜色为 \(c\)。具体地,我们通过以下步骤来把球放到盒子里:
- 如果存在一个非空盒子 \(y\),这个盒子里的所有球颜色为 \(c\) 并且这个盒子里球的个数小于 \(k\),你应当将球放入 \(y\) 号盒子中。
- 如果不存在 (1) 中所述情况,但是存在一个盒子为空,你应当将球放进一个空盒子里。
- 如果不存在 (1)、(2) 中所述情况,你应当将这个球吃掉。
- 当序列中没有球之后(所有球都被放进盒子里或吃掉后),输出盒子里的球的数量。
询问之间互不影响,所有盒子一开始都是空的。
题解:
考虑破环为链后滑动窗口, 删除第一个元素的贡献后添加一个元素到尾部即可.
195. [ABC337G] Tree Inversion
tag: dp
trick: dp(换根)
简要题意:
给出一棵 \(N\)(\(1\le N \le 2\times 10^5\))个点的树,点的编号 \(1\sim N\)。对点 \(u\) 定义 \(f_u\) 为满足以下两个条件的数对 \((v,w)\) 数量:
-
\(w\) 在 \(u\) 到 \(v\) 的简单路径上(\(w\) 可以等于 \(u\) 或 \(v\))。
-
\(v<w\)。
求出所有 \(f_u\)。
题解:
考虑换根 dp, 这样就只考虑一条父子链就可以了.
只需要维护每个点子树内有多少个点对 \(v,w\) 满足 \(v\) 是 \(w\) 的祖先并且 \(v<w\).
换根做这个就行了.
196. [ABC338G] evall
tag: dp
trick: 末尾的权值作为状态
简要题意:
给出字符串 \(S\)。\(S\) 中的每个字符都是 123456789+*
中的一个,\(S\) 的首尾字符都是数字,\(S\) 中没有连续的非数字字符。
对于整数对 \(i, j\)(\(1 \le i \le j \le |S|\)),定义 \(\mathrm{eval}(S_{i..j})\) 如下:
- 如果 \(S\) 的第 \(i\) 个字符和第 \(j\) 个字符都是数字,则 \(\mathrm{eval}(S_{i..j})\) 是 \(S\) 的第 \(i\) 个字符到第 \(j\) 个字符(包括两端)作为一个普通表达式求值的结果(
*
表示乘法)。例如,当 $S = $1+2*151
时,\(\mathrm{eval}(S_{1..6}) = 1 + 2 \times 15 = 31\)。 - 否则,\(\mathrm{eval}(S_{i..j}) = 0\)。
求 \(\displaystyle\ \sum_{i=1}^{|S|}\ \sum_{j=i}^{|S|}\ \mathrm{eval}(S_{i..j})\) 对 \(998244353\) 取模的结果。
题解:
考虑 dp, 维护 \(f_{i,0/1/2}\) 表示目前所有式子的值之和 / 只算最后一项并且不算当前数的和 / 只算最后一项的和.
转移即可.
197. [ABC339G] Smaller Sum
tag: 主席树
trick: 主席树维护在线数点
简要题意:
给定长度为 \(n\) 的数组 \(a\),\(q\) 次询问,每次给定 \(l,r,x\),求在 \(a_l,a_{l+1},...,a_r\) 中小于等于 \(x\) 的所有数之和。
本题强制在线。后一次询问给出的 \(l,r,x\) 需异或上前一次询问的答案。下标从 \(1\) 开始。
数据范围:\(1 \le n,q \le 2 \times 10^5,0 \le a_i \le 10^9\)。读入的 \(l,r,x \le 10^{18}\),实际的 \(l \le r \le n,0\le x \le10^9\)。
题解:
把每个数扔到二维平面上, 这就是个主席树在线二维数点板子.
198. [ABC341F] Breakdown
tag: 背包
trick: 元素之间贡献独立
简要题意:
给定 \(n\) 点 \(m\) 边的无向图,点有点权 \(w_i\),点上可以放有硬币。定义一次操作为:选定一个放有硬币的点 \(u\),选择与 \(u\) 有连边的点的一个子集 \(S\) 满足 \(\sum_{v \in S} w_v < w_u\),移除 \(u\) 上的一个硬币,并在 \(S\) 中所有点处各放一个硬币。初始每个点上有 \(a_i\) 个硬币,求操作可以进行的最多次数。可以证明操作会在有限次数后结束。
\(1 \leq n,m,w_i \leq 5000\),\(0 \leq a_i \leq 10^9\)。
题解:
不难发现每个硬币是独立的, 那么设 \(f_i\) 表示 \(i\) 号节点上每个硬币可操作次数, 背包转移即可.
199. [ABC341G] Highest Ratio
tag: 平均数
trick: 平均值转化为斜率
简要题意:
给定一个长度为 \(N\) 的序列 \(A = (A_1, A_2, \cdots, A_N)\)。
对于每个 \(k = 1, 2, \cdots, N\),解决下面的问题:
-
选择一个正整数 \(r\) ( \(k \le r \le N\) ),使得序列 \(A\) 的第 \(k\) 项到第 \(r\) 项的平均数最大。
这里,序列 \(A\) 的第 \(k\) 项到第 \(r\) 项的平均数定义为 \(\frac{1}{r - k + 1}\sum\limits_{i = k}^r A_i\)。
题解:
不难发现 \(avg=\frac{sum_r-sum_l}{r-l}\), 从几何角度观察不难发现是斜率, 凸包直接做即可.
200. [ABC342F] Black Jack
tag: 博弈论
trick: /
简要题意:
你正在和另一个人玩一个 \(D\) 面的骰子(每个面编号为 \(1\sim D\))。游戏过程如下:
- 你先掷骰子若干次,你的权值 \(x\) 就是你所掷的数字之和。
- 之后,对方也要掷骰子若干次。设 \(y\) 为对方目前所掷的数字之和,当且仅当 \(y < L\) 成立时,他会继续掷骰子(\(y\) 将更新)。
- 如果 \(x > N\),你就输了。
如果 \(x\le N\),那么当 \(y > N\) 或 \(x > y\) 时,你就赢了;否则你还是输了。
试求出你在最优策略下赢的概率。
题解:
直接 dp 求出另一个人落在每个数的概率, 然后求出 A 在最后一个数是谁能赢的概率, 然后 dp 做决策的过程就可以了.
201. [ABC342G] Retroactive Range Chmax
tag: 线段树
trick: 不好上传标记考虑标记永久化, 带删除的修改操作考虑在线段树上每个节点用 set 维护永久化标记
简要题意:
维护一个数列,有以下三个操作:
-
区间最值操作,即将 \([l,r]\) 区间内的 \(A_i\) 变成 \(\max(A_i,v)\)。
-
删除操作操作,即将第 \(i\) 次操作删除,保证第 \(i\) 次操作是操作 \(1\),且未被删除。注:仅删除第 \(i\) 次操作,后续操作仍然在。
-
查询,询问当前的 \(A_i\)。
题解略.
202. [ABC343F] Second Largest Query
tag: 线段树
trick: 可合并信息用线段树
简要题意:
给定长度为 \(N\) 的序列 \(A\) 和一个正整数 \(Q\) 表示有 \(Q\) 次操作,第 \(i\) 次操作格式如下:
1 p x
表示将 \(A_p\) 修改为 \(x\)。2 l r
输出区间 \([l, r]\) 之间严格次大值的数量。
对于每个查询操作,输出一行一个整数代表答案。
题解:
线段树每个节点维护 \(mx,mx2,cntmx,cntmx2\) 即可.
203. [ABC343G] Compress Strings
tag: dp
trick: dp(状态压缩)
简要题意:
给你 \(N\) 个由小写字母组成的字符串 \(S_1, S_2, \ldots, S_N\),找出一个母串使得它包含所有这些字符串作为它的子串,最小化该母串的长度并输出。
\(1 \leq N \leq 20\),\(\sum |S_i| \leq 2 \times 10 ^ 5\)
题解:
考虑先把被包含的字符串判掉, 然后设 \(f_{S,j}\) 表示已经包含的集合为 \(S\), 最后一个包含的串是 \(j\) 的方案数.
204. [ABC344F] Earn to Advance
tag: 最短路
trick: 带状态的最短路, 贪心(极端值)
简要题意:
有一个 \(N \times N\) 的网格,高桥最开始在位置 \((1,1)\),有 \(0\) 个金币。
假设高桥现在处于位置 \((i,j)\),每一秒他
可以做出如下选择中的一种:
- 不移动,获得 \(P_{i,j}\) 的金币。
- 移动到 \((i,j+1)\),花费 \(R_{i,j}\) 的金币。
- 移动到 \((i+1,j)\),花费 \(D_{i,j}\) 的金币。
高桥在任意位置的金币数都不能小于 \(0\)。
求高桥到达 \((N,N)\) 的最小时间。
题解:
我们发现, 最优策略形如在一个地方 \(x_{i}\) 一直赚钱, 跑路, 在另一个地方 \(x_{i+1}\) 一直赚钱, 跑路...
其中满足 \(c_{x_1} < c_{x_2} < \dots < c_{x_k}\)
这是因为如果后面的 \(c\) 更小, 那么把这次赚的钱放到前面去赚只要更少的次数就能完成, 更优.
这样, 我们设 \(f_{u,best}\) 表示目前走到 \(u\) , 上一次赚钱是在 \(best\) 的最优策略.
一个最优策略用一个二元组表示 \((t_i,re_i)\) 表示目前赚钱 \(t_i\) 次, 剩余 \(re_i\) 块钱.
但是无法比较二元组之间的优劣怎么办?
我们发现贪心的先保证 \(t_i\) 更小, 再保证 \(re_i\) 最大一定更优.
为什么呢? 因为所有方案 \(re_i\) 都会小于 \(c_{best}\) (如果大于等于那就可以少赚一次钱.), 那么 \(t_i\) 小的方案就可以再演出一次得到方案 \((t_i+1,re_i+c_{best})\) , 这个二元组会完爆掉 \(t_i\) 较大的方案, 因此贪心是对的.
这个转移只会从 \(t_i\) 小的转移向 \(t_i\) 大的, 因此用类似于 dijkstra 的方式转移即可.
205. [ABC345E] Colorful Subsequence
tag: dp
trick: 末尾的权值作为状态, 把目前已有的代价作为一维
简要题意:
有 \(N\) 个球,每一个球有一个颜色 \(C_i\) 和价值 \(V_i\),现在要删除其中的 \(K\) 个球,使得剩下的球没有相邻的两个球颜色相等。求剩下的球的最大价值总和。
$ K\leq\ 500 $
题解:
考虑直接 dp, 设 \(f_{i,j}\) 表示到 \(i\) 为止选了 \(j\) 个的最大价值, 维护最大值次大值加速转移即可.
206. [ABC345F] Many Lamps
tag: 构造
trick: 把图上的构造压缩到树上, 奇偶性判断是否有解
简要题意:
给定一个 \(N\) 个点 \(M\) 条边的图,每个点上有一个灯,最开始全都熄灭。你可以至多执行 \(M\) 次如下操作,问是否能使得最终有 \(K\) 个灯亮着:
- 选择一条边,使得这条边的两个端点灯的状态反转。
注:要输出方案。
题解:
考虑每个连通块内亮着的点一定是偶数个, 判断无解.
对于一个连通块内部, 考虑随一棵生成树上就能完成构造, dfs即可.
207. [ABC346F] SSttrriinngg in StringString
tag: 二分
trick: 二分答案
简要题意:
对于一个字符串 \(X\) 和一个非负整数 \(k\),定义 \(f(X, k)\) 表示将 \(X\) 重复 \(k\) 次得到的字符串,\(g(X, k)\) 表示将 \(X\) 的每个字符重复 \(k\) 次得到的字符串。例如当 \(X = \texttt{abc}\) 时,\(f(X, 2) = \texttt{abcabc}, g(X, 3) = \texttt{aaabbbccc}\)。特别的,当 \(k = 0\) 时,\(f(X, k), g(X, k)\) 为空串。
给定两个字符串 \(S, T\) 和一个正整数 \(n\)。求最大的非负整数 \(k\) 满足 \(g(T, k)\) 是 \(f(S, n)\) 的子序列。
\(1 \le n \le 10^{12}\),\(1 \le |S|, |T| \le 10^5\)。
题解:
考虑二分答案, 对 \(S\) 里面每个字符向后推至少需要多少遍 \(T\) 余几个字母才能完成.
208. [ABC346G] Alone
tag: 矩形面积并
trick: 一个区间按照 \((l,r)\) 刻画为平面上的点, 用矩形面积并维护容斥
简要题意:
给定一个长度为 \(n\) 的序列 \(A\)。
求其中有多少个子区间中至少有一个数字只出现过一次。
题解:
枚举出现一次的元素, 那么合法范围必然是$ l \in(lst_i,i),r\in(i,nxt_i)$ 放在二维平面上就是矩形. 做矩形面积并即可.
209. [ABC347F] Non-overlapping Squares
tag: 分讨
trick: /
简要题意:
给定一个 \(N \times N\) 的矩阵,在里面选出三个不相交的 \(M \times M\) 的矩阵使得矩阵中的数字和最大,求这个最大和。
\(1 \leq N \leq 1000, 1 \leq M \leq N/2\)。
题解:
对三个正方形相对位置做分讨.
210. [ABC349F] Subsequence LCM
tag: 分讨
trick: 合并等价元素
简要题意:
给你一个长度为 \(N\) 的正整数序列 \(A=(A_1,A_2,\dots,A_N)\) 和一个正整数 \(M\) 。求元素的最小公倍数为 \(M\) 的 \(A\) 的非空子序列(不一定连续)的个数。
由于数量可能很大,你只需输出答案模 \(998244353\) 的结果。
注意:内容相同但位置不同的子序列被认为是不同的子序列。
另外,若子序列仅包含一个元素,认为这个子序列的最小公倍数为这个元素本身。
题解:
首先考虑排除那些不是 \(M\) 因数的数, 其次考虑由于最大公因数本质是取 \(\max\), 那么没有顶到 \(M\) 上界的都没有贡献, 考虑对 \(M\) 的所有质因子坐状压, 然后考虑设 \(f_S\) 表示 \(S\) 集合内的质数都被满足的方案数. 枚举元素的时候不能按照原序列枚举, 发现相同贡献元素可以合并, 最终复杂度 \(O(2^{2k})\), \(k\) 为 \(M\) 质因子个数.
211. [ABC350G] Mediator
tag: 启发式合并
trick: 连通块问题考虑启发式合并
简要题意:
现有一张 \(n\) 结点的无向图,初始时没有边,接下来有 \(Q\) 次操作:
- \({\tt 1}\ u\ v\),加入一条连接 \(u,v\) 的边。保证操作前 \(u,v\) 不在同一个连通块内,换言之这张图总是森林。
- \({\tt 2}\ u\ v\),询问是否存在和 \(u,v\) 都相邻的点,若存在输出编号,若不存在输出 \(0\)。
强制在线.
题解:
实际上要求出来那个中间点, 只需要维护所有点的父亲即可.
启发式合并即可.
212. [ABC352F] Estimate Order
tag: dfs
trick: /
简要题意:
有 \(N\) 人,编号为 \(1\) 至 \(N\) 。
在这些 \(N\) 人中举行了一次竞赛,并对他们进行了相应的排名。以下是他们的排名信息:
- 每个人都有一个唯一的排名。
- 对于每个 \(1 \leq i \leq M\) ,如果 \(A_i\) 排名 \(x\) -th,而 \(B_i\) 排名 \(y\) -th,那么就是 \(x - y = C_i\) 。
给定的输入保证了至少有一种可能的排名与给定的信息不矛盾。
回答 \(N\) 个查询。 \(i\) -th查询的答案是一个整数,确定方法如下:
- 如果可以唯一确定人 \(i\) 的排名,则返回该排名。否则,返回 \(-1\) 。
\(N \leq 16\).
题解:
爆搜即可.
213. [ABC353F] Tile Distance
tag: 分讨
trick: /
简要题意:
瓷砖铺在一个坐标平面上。有两种瓦片:尺寸为 \(1\times1\) 的小瓦片和尺寸为 \(K\times K\) 的大瓦片,它们按以下规则摆放:
- 对于每一对整数 \((i,j)\) ,正方形 \(\lbrace(x,y)\mid i\leq x\leq i+1\wedge j\leq y\leq j+1\rbrace\) 要么包含在一个小图块中,要么包含在一个大图块中。
- 如果 \(\left\lfloor\dfrac iK\right\rfloor+\left\lfloor\dfrac jK\right\rfloor\) 是偶数,则它被包含在一个小方格中。
- 否则,它被包含在一个大瓦片中。
瓦片包括它们的边界,没有两个不同的瓦片有正的交集区域。
例如,当 \(K=3\) 时,瓦片的布局如下:
高桥从坐标平面上的点 \((S_x+0.5,S_y+0.5)\) 开始。
他可以重复下面的动作任意多次:
- 选择一个方向(上、下、左或右)和一个正整数 \(n\) 。向该方向移动 \(n\) 个单位。
每次他从一张牌移动到另一张牌时,必须支付 \(1\) 的过路费。
求高桥到达 \((T_x+0.5,T_y+0.5)\) 点所需支付的最小通行费。
题解略.
214. [ABC355E] Guess the Sum
tag: 最短路
trick: 图论最短路刻画最优化问题
简要题意:
这道题是一道交互题,使用标准输入输出流进行交互。
给定正整数 \(N\) 和整数 \(L\)、\(R\),其中 \(0\le L\le R<2^N\)。交互库有一个长为 \(2^N\) 的整数数列 \(A\),数列从 \(0\) 开始编号,数列 \(A\) 中每个数都在 \(0\) 到 \(99\) 之间。(包括 \(0\) 和 \(99\))
你无法直接输入数列 \(A\)。
你的目标是求出 \((A_L+A_{L+1}+\cdots+A_R)\bmod100\) 的值。
你每次询问可以指定整数 \(i\) 和 \(j\),令 \(l=2^ij\),\(r=2^i(j+1)-1\)。则交互库会回复 \((A_l+A_{l+1}+\cdots+A_r)\bmod100\) 的值。
设 \(m\) 为最优解确定最终答案所需的询问次数,那么不能询问超过 \(m\) 次。
题解:
考虑图论建模, 每个可用的询问方式都从 \(l\) 到 \(r + 1\) 连一条边, 这样跑最短路即可.
215. [ABC356F] Distance Component Size Query
tag: 平衡树
trick: /
简要题意:
给你一个整数 \(K\)。对于初始为空的集合 \(S\),依次处理 \(Q\) 个操作:
1 x
:给出一个整数 \(x\) 。如果 \(x\) 在 \(S\) 中,则从 \(S\) 中删除 \(x\) 。否则,将 \(x\) 加到 \(S\) 中。2 x
:给出位于 \(S\) 中的整数 \(x\) 。考虑一个图,其中顶点是 \(S\) 中的数字,并且当且仅当两个数字之间的绝对差最多为 \(K\) 时,两个数字之间有一条边。求 \(x\) 所在联通块中的顶点数。
题解:
考虑用平衡树维护每个连通块, 加入一个数可能导致两个 treap 合并; 删除一个就可能会有分裂.
查询直接找到根查询子树大小即可.
216. [ABC358F] Easiest Maze
tag: 构造
trick: 答案在上下界内任取, 奇偶性判断是否有解
简要题意:
如果不存在方案,输出No
。
如果存在方案,输出Yes
,接下来 \(2n+1\) 行,每行输出 \(2m+1\) 个字符,表示迷宫:
- 对于最外面一圈:除了入口是
S
,出口是G
,其他都是+
。 - 对于偶数行偶数列:你输出的第 \(2x\) 行,\(2y\) 列表示原迷宫中的 \((x,y)\),这是一个格子,因此只需输出
o
。 - 对于奇数行偶数列:你输出的第 \(2x+1\) 行,\(2y\) 列表示原迷宫中 \((x,y)\) 与 \((x+1,y)\) 的公共边。如果这是墙输出
-
,否则输出.
。 - 对于偶数行奇数列:同上,但如果是墙输出
|
。 - 对于奇数行奇数列:这代表着四个格子的交界点,因此只需输出
+
。
\(2 \le n \le 100\),\(1 \le m \le 100\),\(1 \le k \le nm\)。
题解:
求出上下界后发现一次调整只能调整两个格子, 于是套判断奇偶性即可.
217. [ABC359G] Sum of Tree Distance
tag: 启发式合并, 虚树
trick: 虚树分别做每一类点
简要题意:
给你一棵有 \(N\) 个顶点的树。 \(i\) 这条边双向连接顶点 \(u_i\) 和 \(v_i\) 。
此外,还给出了一个整数序列 \(A=(A_1,\ldots,A_N)\) 。
在此,定义 \(f(i,j)\) 如下:
- 如果是 \(A_i = A_j\) ,那么 \(f(i,j)\) 就是从顶点 \(i\) 移动到顶点 \(j\) 所需的最小边数。如果是 \(A_i \neq A_j\) ,那么就是 \(f(i,j) = 0\) 。
计算下面表达式的值:
\(\displaystyle \sum_{i=1}^{N-1}\sum_{j=i+1}^N f(i,j)\) .
题解略.
218. [ABC360F] InterSections
tag: 扫描线
trick: 一个区间按照 \((l,r)\) 刻画为平面上的点
简要题意:
考虑一个区间能够给答案带来什么影响.
如果把答案区间拍到二维平面上, 那么就是一个矩形的贡献.
那么只需要扫描线做一下最大被覆盖次数就好了.
219. [ABC360G] Suitable Edit for LIS
tag: dp
trick: 把目前已有的代价作为一维
简要题意:
给定一个长度为 \(N\) 的整数序列,选择一个整数 \(x\),其值在 \(1\) 到 \(N\)(包括 \(1\) 和 \(N\))之间,以及一个任意的整数 \(y\)。将 \(A_x\)替换为 \(y\)。
请找出在执行此操作后,序列 \(A\) 的最长递增子序列(LIS)的可能的最大长度。
题解:
考虑 dp, 设 \(f_{i,0/1}\) 表示前 \(i\) 个元素修没修改过的最大答案, 暴力转移即可.
220. [ABC362F] Perfect Matching on a Tree
tag: 树论, 构造, 贪心
trick: 树的重心上的构造, 贪心(交换法判断最优)
简要题意:
给你一个长度为 \(N\) 的正整数序列 \(A=(A_1,A_2,\dots,A_N)\) 和一个正整数 \(M\) 。求元素的最小公倍数为 \(M\) 的 \(A\) 的非空子序列(不一定连续)的个数。
由于数量可能很大,你只需输出答案模 \(998244353\) 的结果。
注意:内容相同但位置不同的子序列被认为是不同的子序列。
另外,若子序列仅包含一个元素,认为这个子序列的最小公倍数为这个元素本身。
题解:
考虑交换一组匹配, 列列式子发现这组匹配的链必然有交点, 否则不优.
于是每组匹配共用一个交点.
发现这个交点一定是重心, 否则一定有一个子树太大匹配不完.
模拟即可.
221. [ABC362G] Count Substring Query
tag: AC自动机
trick: /
简要题意:
给你一个字符串 \(S\) 和 \(Q\) 个字符串, \(T_1\) ~ \(T_q\) ,问每一个 \(T_i\) 分别在 \(S\) 中出现多少次。
题解略.
222. [ABC365G] AtCoder Office
tag: 根号分治
trick: 根号分治
简要题意:
有 \(n\) 个人在办公室工作。
办公室的门有出入记录系统。现在共有 \(m\) 条记录,每条记录由二元组 \((T_i,P_i)\) 组成,表示在 \(T_i\) 的时间 \(P_i\) 号人进入或走出办公室(若当时在外面即为进入,在里面即为出去)。
一开始所有人都在外面。
给定 \(q\) 次询问,每次询问 \(A_i\) 号和 \(B_i\) 号人同时在办公室的最长时间。
题解:
考虑根号分治, 对于那些出现次数超过根号次的人, 考虑在别人出入房间时都累加对他们的贡献; 对于询问两边都小于根号的情况, 考虑现场把这两倍根号个区间拿出来扫描线即可.
223. [ABC366G] XOR Neighbors
tag: 高斯消元
trick: 用方程组描述问题后高斯消元, 二进制位间贡献独立, 钦定每个元素在不同的位有值保持独立且非0
简要题意:
给出一个具有 \(N\) 个顶点和 \(M\) 个边的简单无向图。第 \(i\) 个棱双向连接顶点 \(u_i\) 和 \(v_i\) 。
确定是否存在一种方法可以在此图的每个顶点上写入 \(1\) 和 \(2^{60} - 1\) 之间的整数,以满足以下条件:
对于每个至少有 \(1\) 度的顶点 \(v\) ,写在其相邻顶点(不包括 \(v\) 本身)上的数字的总异或为 \(0\)。
\(1 \leq N \leq 60\)
题解:
sol1:
考虑先拆位, 然后列出来异或方程组高消一下, 然后对于第 \(i\) 位, 钦定 \(a_{i,i}=1\) 后添加一条约束再高消一遍求出一个可行解即可.
这样拆位后钦定第 \(i\) 位 \(a_i=1\) 保证了合并后每个点的权值都不为 \(0\).
sol2:
考虑构造每一位解集所对应的线性基.
考虑高斯消元之后, 我们认为存在一些关于自由元的方程组, 这些自由元的取值会唯一对应于一组解. 我们把这些自由元依次枚举, 认为枚举到的是 1, 剩下的是 0, 然后解出所有未知数后插入线性基即可. 可以证明这样生成的解集的基底可以作为完整解集的基底.
224. [ABC368E] Train Delay
tag: 差分约束
trick: 遇到对前缀和的约束时考虑差分约束
简要题意:
在 Atcoder 国家,有 \(N\) 座城市,编号为 \(1\) 至 \(N\) ,以及 \(M\) 列火车,编号为 \(1\) 至 \(M\) 。 \(i\) 次列车在 \(S_i\) 点从城市 \(A_i\) 出发,在 \(T_i\) 点到达城市 \(B_i\) 。
给定一个正整数 \(X_1\) ,求一个非负整数 \(X_2,\ldots,X_M\) 的最小值 \(X_2+\ldots+X_M\) ,以满足下列条件。
- 条件对于所有满足 \(1 \leq i,j \leq M\) 的一对 \((i,j)\) ,如果 \(B_i=A_j\) 和 \(T_i \leq S_j\) ,那么 \(T_i+X_i \leq S_j+X_j\) 。
- 换句话说,对于任何一对原本可以换乘的列车,即使将每趟列车 \(i\) 的出发和到达时间延迟 \(X_i\) ,仍然可以换乘。
可以证明,这种将 \(X_2,\ldots,X_M\) 设置为 \(X_2+\ldots+X_M\) 的最小值的方法是唯一的。
题解略.
225. [ABC369G] As far as possible
tag: 长链剖分
trick: 每次扩展最长链考虑长剖
简要题意:
你有一棵 \(N\) 个顶点的树。顶点编号为 \(1\) 、 \(2\) 、 \(\ldots\) 、 \(N\)。第 \(i\) 条边( \(1\leq i\leq N-1\) )连接顶点 \(U_i\) 和 \(V_i\) ,长度为 \(L_i\) 。
请为每一个整数 \(K \in [1,N]\) 解决下面的问题:
高桥和青木下了一盘棋。博弈过程如下
- 首先,青木在树上指定 \(K\) 个不同的顶点。
- 然后,高桥构建一个起点和终点都在顶点 \(1\) 的途径,满足经过青木指定的所有顶点。
得分定义为高桥构建的行走的长度。高桥想要最小化得分,而青木想要最大化得分。求两位棋手都以最佳方式下棋时的得分。
题解:
考虑每增加一个棋子, 那么就可以牵制对方一条链, 想让这个链最长, 那么直接长剖对每条长链从长到短加入即可.
226. [ABC370F] Cake Division
tag: 二分, 倍增
trick: 二分答案, 前途唯一条件单调可以倍增
简要题意:
有一个圆形蛋糕,通过切割线被分成了 \(N\) 块。每条切割线是一条从圆心连接到圆弧上某点的线段。
这些块和切割线按顺时针方向编号为 \(1, 2, \ldots, N\),其中第 \(i\) 块的质量为 \(A_i\)。第 \(1\) 块也被称作第 \(N + 1\) 块。
切割线 \(i\) 位于第 \(i\) 块和第 \(i + 1\) 块之间,它们按照如下顺序排列:第 \(1\) 块,切割线 \(1\),第 \(2\) 块,切割线 \(2\),\(\ldots\),第 \(N\) 块,切割线 \(N\)。
我们希望在以下条件下将这个蛋糕分给 \(K\) 个人。令 \(w_i\) 表示第 \(i\) 个人所得到的蛋糕块质量之和。
- 每个人分得一个或多个连续的蛋糕块。
- 没有未被分配的蛋糕块。
- 在上述两个条件的基础上,使得 \(\min(w_1, w_2, \ldots, w_K)\) 的值最大化。
找到满足条件的分配方案中 \(\min(w_1, w_2, \ldots, w_K)\) 的值,以及在满足条件的所有分配方案中,从未被切割过的切割线条数。这里,如果第 \(i\) 块和第 \(i + 1\) 块被分配给了不同的人,则认为切割线 \(i\) 被切割了。
题解:
首先最大值最小考虑二分答案, 然后验证时需要枚举断环为链分界点, 随后跑一个倍增加速跳即可.
227. [ABC371F] Takahashi in Narrow Road
tag: 线段树, 颜色段均摊
trick: 单调递增子序列转化为单调非降子序列
简要题意:
在数轴上有 \(N\) 个人,每个人的坐标为 \(X_i\)。
你可以执行以下操作任意次:
- 选择一个人。如果目的地没有其他人,将这个人向左或向右移动 \(1\) 米。
有 \(Q\) 个任务,每个任务内容如下:
- 将第 \(T_i\) 个人移动到位置 \(G_i\)
你需要按顺序完成所有任务,求最少进行多少次操作。
题解:
考虑一次操作会把一段人挤成一个等差数列, 那不妨把第 \(i\) 个人的位置减掉 \(i\), 那么一次操作就会把一段人挤成一个人. 线段树维护一下或者 ODT 维护连续段均可.
228. [ABC371G] Lexicographically Smallest Permutation
tag: 贪心, 同余
trick: 贪心(字典序), 同余方程拆为对质数的同余方程组
简要题意:
小 M 有两个长度为 \(n\) 且字符集为 \(\{0, 1\}\) 的字符串 \(s_1, s_2\)。
小 M 希望两个字符串中对应位置字符相同的出现次数尽可能多,即满足 \(s_{1,i} = s_{2,i}\) 的 \(i(1 \leq i \leq n)\) 尽可能多。为此小 M 有一个字符串编辑工具,这个工具提供的基本操作是在一个字符串中交换两个相邻的字符。为了保持字符串的可辨识性,规定两个字符串中的部分字符不能参与交换。小 M 可以用工具对 \(s_1\) 或 \(s_2\) 进行多次字符交换,其中可以参与交换的字符能够交换任意多次。
现在小 M 想知道,在使用编辑工具后,两个字符串中对应位置字符相同的出现次数最多能有多少。
题解:
考虑贪心对每个环做考虑.
把每个环按照所含有的最小编号排序, 这样可以保证按照字典序贪心. 然后依次考虑每个环, 我们想要贪心的让这个环的最小元素获得尽可能小的元素值, 这样就对实际旋转次数做出了限制: \(ans \equiv dis \mod len\).
然而我们以前可能已经有了一些方程, 我们需要判断这个新方程是否和以前的冲突.
考虑把每个方程拆解为对模数质因数的同余方程, 这样就可以 \(O(\log n)\) 时间内 check.
229. [ABC372F] Teleporting Takahashi 2
tag: dp
trick: dp优化(从整体角度考虑变化)
简要题意:
有一张有 \(N\) 个顶点和 \(N+M\) 条边的简单有向图 \(G\)。顶点从 \(1\) 到 \(N\) 标号,边从 \(1\) 到 \(N+M\) 标号。
第 \(i(1\le i\le N)\) 条边从 \(i\) 连向 \(i+1\)。(这里的 \(N+1\) 号点是 \(1\) 号点。)
第 \(N+i(1\le i\le M)\) 条边从 \(X_i\) 连向 \(Y_i\)。
高桥在 \(1\) 号点。在每个顶点,他可以移动到任何与这个顶点有边相连的点。
计算出他有多少种方式能够移动 \(K\) 次。
也就是说,找到满足以下条件的长度为 \(K+1\) 的序列 \((v_0,v_1,\dots,v_K)\) 的数量:
- 对于 \(i=0,1,\dots,K\),\(1\le v_i\le N\)。
- \(v_0=1\)。
- 对于 \(i=1,2,\dots,K\) 存在一条从 \(v_{i-1}\) 到 \(v_i\) 的边。
因为答案可能很大,所以你需要输出答案对 \(998244353\) 取模后的值。
题解:
考虑朴素的 dp, 设 \(f_{i,j}\) 表示走 \(j\) 步到 \(i\) 的方案数.
每一条边都是一次转移, 考虑到绝大部分边在环上, 这实际上是一个循环移位的过程, 那么考虑更改状态, 设 \(f_{i,j}\) 表示走 \(j\) 步到 \((i + j) \bmod n\) 的方案数. 这样的话, 就免去大量的转移, 复杂度 \(O(n+km)\).
230. [ABC374F] Shipping
tag: dp
trick: dp优化(贪心), 把目前已有的代价作为一维
简要题意:
有订单 \(1,2,\dots,N\) ,已知订单 \(i\) 将在第 \(T_i\) 天下达。
对于这些订单,将根据以下规则进行发货。
- 最多有 \(K\) 个订单可以一起发货。
- 订单 \(i\) 只能在第 \(T_i\) 天或之后发货。
- 一旦发货,下一次发货要等到 \(X\) 天之后。
- 也就是说,如果在 \(a\) 日发货,下一批货物只能在 \(a+X\) 日及以后发货。
从下单到发货,每过一天,不满意度就会每天累积 \(1\) 。
也就是说,如果订单 \(i\) 在第 \(S_i\) 天发货,则该订单的不满意度累积为 \((S_i - T_i)\) 。
求优化安排发货日期时,所有订单累积的总不满意度的最小值。
\(n \leq 100,V \leq 10^9\).
题解:
考虑可用的发货时间其实不会很多.
贪心的想, 要么是上一次刚回来就送, 要么是有一个货刚到的时候送, 因此所有的发货日期都可以表示为 \(T_i + kX\).
因此设计状态设 \(f_{i,j,k}\) 表示在 \(T_i+kX\) 时间, 已经送出去 \(j\) 件的最小代价.
这样的话枚举上面两种情况刷下表即可, 复杂度 \(O(n^4)\).
231. [ABC375G] Road Blocked 2
tag: 最短路
trick: 跑 dij 做最短路计数
简要题意:
\(n\) 个点 \(m\) 条边的无向联通图。对于每一条边 \(i\),若删除该边后 \(1\) 到 \(n\) 的最短路改变则输出 Yes
否则输出 No
。
题解:
考虑正反图对最短路做计数即可.
232. [ABC377F] Avoid Queen Attack
tag: 容斥
trick: 简单容斥
简要题意:
有一个由 \(N^2\) 个正方形组成的网格,网格中有 \(N\) 行和 \(N\) 列。让 \((i,j)\) 表示从上面 \((1\leq i\leq N)\) 起第 \(i\) 行,从左边 \((1\leq j\leq N)\) 起第 \(j\) 列的正方形。
每个方格要么是空的,要么有一个棋子放在上面。网格上有 \(M\) 个棋子,而 \(k\) - \((1\leq k\leq M)\) 个棋子被放置在 \((a_k,b_k)\) 个方格上。
你想把棋子放在一个空方格上,这样它就不会被任何现有的棋子吃掉。
放置在 \((i,j)\) 位置上的棋子可以吃掉满足以下任何条件的棋子:
- 置于行 \(i\) 中
- 置于列 \(j\) 中
- 放置在 \(i+j=a+b\) 所在的任意位置 \((a,b)\ (1\leq a\leq N,1\leq b\leq N)\) 上
- 放置在 \(i-j=a-b\) 所在的任意位置 \((a,b)\ (1\leq a\leq N,1\leq b\leq N)\) 上
您可以将棋子放在几个位置上?
$ 1\leq\ M\leq10\ ^\ 3 $
题解:
不能放的位置一共只有 \(15\) 种贡献情况.
考虑枚举不能用的两个平行线束即可.
233. [ABC379G] Count Grid 3-coloring
tag: 根号分治, dp
trick: dp(状态压缩), 根号分治
简要题意:
给你一个网格 \(S\) ,其中有 \(H\) 行和 \(W\) 列,分别由 1
、2
、3
和 ?
组成。第 \(i\) 行和第 \(j\) 列的字符是 \(S_{i,j}\) 。
设网格中有 \(q\) 个 ?
,将 \(S\) 中的每个 ?
替换为 1
、2
、3
中的其中一个数,可以得到 \(3^q\) 个不同的网格。在这些网格中,有多少满足以下条件?输出答案对 \(998244353\) 取模的结果。
- 任意两个相邻(共边)的单元格包含不同的数字。
\(HW\leq 200\).
题解:
考虑根号分治, 一定会有一条边长度小于 \(14\), 考虑直接状压这条边上的所有方案并且预处理转移即可.
234. [ABC384G] Abs Sum
tag: 莫队
trick: 发现询问支持加入和删除一个元素考虑莫队, 二次离线消掉 log
简要题意:
给定长度为\(N\)的整数序列\(A,B\)和长度为\(K\)的正整数序列\(X,Y\),对于\(k=1,2,3,...,K\),求\(\sum_{i = 1}^{X_k} \sum_{j = 1}^{Y_k} |A_i-B_j|\)。
题解略.