Date range: 10.12 - 10.29
求 [a,b] 之间相邻数位只差不超过 2 的数字个数。
数位 dp,状态表示为:走了几位,最后一位是几,当前数字是否贴着上界。
求 [a,b] 二进制表示中 0 的个数大于 1 的个数的数有多少个。
数位 dp,状态表示为:走了几位,当前 0 的个数,当前 1 的个数。
求满足本身乘以它所有数位的乘积在 [a,b] 之间的所有数字的个数。
所有数位的乘积数目很少,暴力枚举之,然后会做一个关于质因子数目限定的数位 dp。
构造一个具有 n 的三元环的无向图,n 不超过 2e6,点数不超过 500.
暴力,不断构造若干个相互独立的完全图。
给定 n 根柱子,按任意顺序放置为一个二维图形,求所有可能的盛水量。
显然我们只会从高到低放置柱子或者放弃一些柱子,维护水量和柱子高度的总和,f[i][j]
表示填了 i
个空位,能否拼成 j
的水量和柱子高度的总和,暴力转移即可,用 bitset
优化。
求带点权无向图的边权和最小的哈密顿回路,边权是点权的差的平方。
只需要最优化交叉乘积项,找规律贪心。
点权树,求极差不超过 d 的连通子图的个数。
(O(n^2)) 的树形 dp,难点在于处理点权相等的情况,此时比较编号即可。
给定一个序列,如果 i,j 中间没有任何一个数比端点大,或者没有任何一个数比端点小,则可以从 i 跳到 j。求从 1 跳到 n 的最小步数。
考虑 dp,所有转移来源对应单调栈弹栈过程中经历的所有栈顶。
在树上删除最多的边,使得所有点离最近的黑点的距离不超过 d。
从所有黑点开始 BFS,若 q 被访问过而 (p,q) 没被访问过,则 (p,q) 可以被删。
给定一个序列无限次操作,每次选择一个区间让该区间内的所有数变成区间的平均数,求操作后字典序最小的序列。
单调栈,每次栈顶比待入栈元素高就暴力弹栈,将被弹出的元素和待入栈的元素合并。
给定一张 (n,m le 10^3) 的图,有 (k) 个点对 ((a_i,b_i)) 表示运输项目,选择一条边的权值变为 (0) 来最小化所有运输项目的最短距离的和。
考虑 ((u,v)) 变为 (0) 对 ((a,b)) 的影响,分经过和不经过 (u,v) 讨论
在 (n imes m) 迷宫中一秒钟可以向四个方向中的一个移动 (1 o k) 步,求起点到终点的最短时间。(n,m,k le 1000)
正常 BFS,剪枝条件小心。
给定一个 (n imes m) 矩阵,要求每行只能选取不超过一般的元素,使得选出元素的总和是 (k) 的倍数,且这个总和最大。求这个最大值。
一堆 dp。
给定一本字典的若干页,每页上会有若干个单词,这本字典的字母顺序是标准顺序的一个排列。求出任意一种排列或者判定非法。重编号后简单拓扑排序。
给定一个长度为 n 的序列 a,有 q 次操作,每次交换 a[l],a[r],在操作前和每次操作后,求出 a 中所有子序列的交替和的最大值。
其实就是在差分序列中选出一些段。于是只需要选择那些 >0 的部分即可。同时每次操作只会影响到不超过 4 个位置,暴力维护即可。
将 n 的所有大于 1 的因数任意排列在一个环上,每次选择相邻两个数,在中间插入他们的最小公倍数,使得环上不存在两个相邻且互质的数。找到一个操作次数最少的排列。
从最小数开始每次选择一个与上一个数不互质的最小数输出。
数轴上有 n 个点,每次操作可以把所有位于 x 的左移或右移一格,求所有点移动到不超过两个整点的最小操作次数。对点集做出修改,动态维护答案。
对于有序集,维护最大 gap。
给定有根树,每个结点上有 N 个人,每个人可以选择任意孩子方向走,直到走到叶子结点为止,问最后人最多的叶子结点最多有多少人。
p 的答案一定不会小于 q 的答案,也不小于整个子树平均分配的答案。这也是一定能取到的。
给定一个数列,其中一些元素固定,另一些元素可以修改。要求修改最少的元素使得这个序列变成严格单增的序列。
固定元素将原序列分割成了若干段,每段内求一下 LCS,剩下的就是需要移动的。注意,如果超出了左右两侧的固定元素限制的值域,那么这个元素也必须被移动。