DP 做题记录
1|0复杂DP
写在最前面的一些话。
DP 算是最常见的一种题目了,类型多样,很值得研究。
究其本质,DP 可以看做是在 DFA(有限状态自动机)上沿着转移边进行转移。考虑某种组合结构,所有满足某一条件的该结构作为元素组成一个解集,题意要求求出这些解的某种权值经过某种运算后的结果,DP 就是使得自动机在这些解上运行。这种情况下的 dp 大致有三类:最优化、计数、判定。在所有合法解不漏的前提下,它们需要满足的关键条件是:最优子结构、不计重、无后效性。
常见的 DP 结构有:
区间 DP,状态压缩 DP,树形 DP,背包 DP,概率/期望 DP,子集(SOS)DP 等。
通用的思考方法:
- 分析模型性质,简化模型,揭开模型“真面目”;
- 处理模型,找到可以用 dp 解决的对象;
- 明确转化后的问题,设计 dp 方式;
- 优化 dp。
第一步就是简化条件、模型、过程,让问题更简洁清晰。
第二步就是考虑模型的“要素”,一般是模型结构的组成部分、相关量或维度。一个模型包含多个要素,要素之间的关系就是题目条件和描述,以及导出的性质。
第三步就是设计状态。状态需要满足最优子结构、不计重、无后效性,接着是转移方式,有填表法、刷表法、记忆化搜索等方式。
最后就是优化。最基础的就是优化状态,然后就是前缀和优化,数据结构优化,倍增优化,决策单调性,CDQ 分治等优化手段。
1|1CF123C Brackets
题意:括号数组是一个只有 “(” 或 “)” 两类字符的二维数组。括号数组中的合法路径只能从任意位置开始,向右或向下移动。如果一个 n×m 括号数组中从 (1,1) 到 (n,m) 的所有路径经过的字符构成的字符串均为可以完全匹配的括号序列,则这个括号数组可以被称作神奇数组。
现在定义一种比较神奇数组大小的方式,假设这两个数组分别为 a 和 b ,两个数组行列均相等,找到数组中满足条件 a i,j=b
i,j 的位置 (i,j) ,如果有多个这样的位置,则选择优先级编号最小的位置(数据中已给出),如果此时 a i,j= “(” ,则 a<b ,否则 a>b ,如果不存在这样的位置,则 a 和 b 相等。根据以上定义,请找出第 k 大的神奇数组。
思路:有性质就是因为所有路径都合法,那么对于任意的
于是每一个对角线上的括号都是相同的,我们可以只用管外轮廓上的括号,于是就逐位确定,每次用
复杂度
trick:分析性质,简化状态。
1|2P4229 某位歌姬的故事
题意:有一个长为
思路:先离散化。对于一个区间,求出所有包含它的限制中最小的一个
dp 时,首先取出所有
复杂度
trick:先确定每个元素的限制,再根据限制进行 DP。
1|3CF1476F Lanterns
题意:有
思路:考虑 dp。设
转移时,如果
如果向右,那么
trick:覆盖全集
1|4P5336 [THUSC2016] 成绩单
题意:就是给出一个序列,每次从序列里抽出连续的一段,这一段的代价为
思路:一种很新的区间DP,删掉后会合并的DP。
这样状态要把端点加进去,例如加入右端点,于是设
设
于是有转移:
保留
取
trick:如果普通的区间 DP 不适用,可以尝试添加状态。
1|5[AGC036D] Negative Cycle
题意:有一个
对于每一对
Ringo 不喜欢图中的负环,所以他想要删掉一些 Snuke 加入的边,使得最终得到的图没有负环。但是删掉每一条边是有代价的,具体地说,删掉
请问满足图中不存在负环的最小删边代价是多少?
思路:考虑按照差分约束连边,这样设最短路为
我们发现,
如果
trick:通过模型转换得出合法条件,再进行 DP。
1|6[ABC077D] Small Multiple
题意:给定一个整数
思路:先考虑 DP,设
我们发现问题在于我们不知道位数的大小,这就导致转移很困难。但是其实我们并不需要知道具体的位数,于是可以去掉第一维。但是这时转移并不是一个 DAG,不能直接 DP,而这个转移有很像最短路,于是可以考虑用最短路求解。由于边权只有 01,于是可以直接用 01bfs,复杂度
trick:如果 DP 转移不能直接递推,可以尝试通过转移的性质用其他方法(如最短路)进行转移。
1|7CF1372E Omkar and Last Floor
题意:一个
思路:首先,可以贪心地想到让尽量多的
trick:通过贪心确定了一列的答案,把问题变成了两个区间的问题,于是考虑用区间 DP 来求解。
1|8CF1420E Battle Lemmings
题意:有
称一对守卫是被保护的,当且仅当这两个守卫都没拿盾牌,但他们之间有守卫拿了盾牌。
每一秒,指挥官可以下达两种命令中的一种,分别是:
- 选一个带盾牌的守卫,把它的盾牌给他左边的守卫
- 选一个带盾牌的守卫,把它的盾牌给他右边的守卫
请求出时刻
思路:首先,被保护的对数等于总对数减去每一段连续的 0 的对数。同时,如果我们知道了初始态和最终态,可以贪心地求出最少的交换次数。
设
trick:转化贡献使得更好计算。
1|9CF1422E Minlexes
题意:给定一只由小写字母组成的字符串
思路:首先可以直接 DP,设
在写法上,可以用结构体来减小代码难度。
trick:DP 可以维护的并不仅仅是数值,只要是可以比较的方便维护的信息也可以,要灵活处理。
1|10CF1572C Paint
题意:给定长度为
思路:直接区间 DP,设
trick:可以通过添加额外限制简化 DP 的状态。
1|11CF1580B Mathematics Curriculum
题意:求长为
思路:考虑上笛卡尔树,那么就变成了求恰好有
于是直接设
trick:区间最大值有关
1|12CF1854E Boxes and Balls
题意:给定一个长度为
- 交换数列中一对相邻的
和 。
问在恰好
思路:首先,我们的策略肯定是先花最小的代价移动到目标状态,然后再选一对01反复横跳,因此只要步数和
设
设
于是就设
trick:对于不降序列对应位置的距离之和,可以在每个间隔处统计答案。
1|13P8258 [CTS2022] 独立集问题
思路:抽象 DP 题。
首先,可以把操作当成是把周围的点的权值吸过来,而且操作多次自己可以就相当于是取相反数。
于是就可以设计状态:
1|14P3953 [NOIP2017 提高组] 逛公园
题意:求有多少条从 1 到
思路:容易想到设
trick:对于图上问题,不好确定 DP 转移顺序可以用记忆化搜索。
1|15P4649 [IOI2007] training 训练路径
题意:给定一个无向图,你需要删掉一些边,使得此图没有长度为偶数的简单环。删掉第
思路:没看出最终是个仙人掌,输麻了。
首先,把会形成偶环的非树边删掉,这时只剩一些奇环,我们发现,如果有一条边同时出现在两个奇环里,那么就会形成一个偶环,因此每条边至多出现在一个环里,即这张图是个仙人掌。
于是就可以 DP。先变成求可以留下的非树边权值的最大值。我们设
trick:通过特殊的数据范围可以往状压的方面想。
1|16P5299 [PKUWC2018] Slay the Spire
题意:有
思路:好像就是组合数+推式子?
首先确定策略。通过调整法可以证明,在至少有一张攻击牌的情况下,选择强化牌会更优。
设
然后分两种情况。
1.强化牌数量小于
2.强化牌数量大于等于
trick:从边界情况入手。
1|17P9330 [JOISC 2023 Day1] Festivals in JOI Kingdom 2
思路:神仙DP题。
首先,发现正着求不好求,于是考虑求假贪心可以求出正确答案的方案数。
我们把所有区间画出来,红色的是正贪心的区间,蓝色的是假贪心的区间,紫色是正贪心和假贪心一样的区间,剩下的是黑区间。然后就可以发现一些性质:
对于红区间,首先是无交,并且相邻两个红区间的右端点之间和第一个红区间之前没有完整区间。
对于蓝区间,首先是无交,并且前一个蓝区间的右端点和后一个蓝区间的左端之间以及第一个蓝区间之间不存在其他的左端点。
对于一对红蓝区间,红区间的右端点一定大于前一对里蓝区间的右端点,不大于这一对里蓝区间的右端点。
于是就可以DP了。考虑顺次加入一对红蓝区间,那么就需要枚举新加进来的黑区间,同时,因为黑区间的左端点要满足不在任意两个蓝区间之间,还需枚举可以作为黑区间左端点的数量,这样就是2D/1D的。
转移显然没法优化,考虑优化状态。我们发现,如果倒着加入红蓝区间,那么对黑区间的限制只有右端点,这样就是1D/1D的。
正解需要把转移写成卷积,然后用任意模数NTT或者
1|18P9338 [JOISC 2023 Day3] Chorus
思路:考场上推出了一些性质,但是还是只会指数级暴力。
这种题有一种比较通用的想法,把 A/B 当做向上、右走,这样可以转成平面,然后 AB 翻转相当于把一个角翻折,这样最终
发现恰好这个限制很可以 WQS 二分,于是就 WQS 二分。设
trick:只有两种元素
1|19P9339 [JOISC 2023 Day3] Cookies
题意:有
思路:首先确定是否有解。可以顺推。对于最大的桶
于是就知道了取前若干个桶时大小的上界,于是就可以 DP,设
trick:分析实际有效的数据范围;如果 DP 维护的值只有 01 可以考虑用 bitset。
1|20[ARC121F] Logical Operations on Tree
题意:给定一棵树,给每个点填
思路:首先,策略肯定是先把 AND 的边缩起来,因此合法的条件就是有一个 1 点周围都是 OR 边或者一个 AND 边连通块内都是 1 点。发现这个条件还是比较复杂,考虑补集,就是每个 AND 连通块内至少有一个 0 点。于是就可以 DP。对于一条边,如果当做 OR 边就相当于是把连通块割开。
设
trick:正难则反。
1|21CF1348E Phoenix and Berries
题意:小P在花园里摘红梅和蓝莓。
他一共有
给出篮子的最大容量
思路:大概的方向是对的,不过应该是还差一步。
有一个结论,每个树至多只会装满一个红、蓝都有的篮子。
考虑DP。设
1|22CF1539E Game with Cards
题意:有两个数
每次操作会有三行。对于第
第一行是一个数
第二行是两个数
第三行是两个数
问是否可以完成所有的
思路:很有意思的题目。
自己只想到了类似二分图匹配的做法,不太能过的样子。
正解是很巧妙的 DP。
首先有一个常见的
于是就可以 dp。设
但是这还不够。我们发现,对于每个
trick:对于 01 序列,可以把连续段一起考虑,这样就只剩下 01010 的结构。
1|23CF1612F Armor and Weapons
思路:想到了比较关键的部分(好像对于其他人都是“显然”?)
关键部分:答案的上界近似是
于是这题就可以很暴力的做了。设
把第一维滚掉暴力做就可以了。
trick:分析实际数据范围,减小状态量。
1|24P4895 独钓寒江雪
题意:给定一棵无根树,求其中本质不同的独立集的个数。
思路:好题。
因为是无根树,而且和同构有关,不难想到以重心为根转成有根树。
考虑和正常的求独立集的 DP 不同在哪里,就是如果有同构的子树那么方案数会有重复,于是可以把同构的子树一起处理,可以用组合数计算。
对于两个重心的情况,新建一个节点当做根即可。
trick:无根树同构
1|25P5243 [USACO19FEB] Moorio Kart P
题意:
思路:没看懂
复杂度是因为
trick:复杂度的精细分析。
1|26P5853 [USACO19DEC] Tree Depth P
题意:逆序对数为
思路:好题。
刚开始看时还找了一下关于笛卡尔树深度计数的博客,好像没啥,只有 cmd 有博客,不过没太看懂。
有
首先,考虑怎么求长为
回到这道题,我们求深度和,可以考虑求对深度有贡献的点对数,即有多少对
于是考虑先固定
于是求出
trick:撤销背包。
1|27P6596 How Many of Them
题意:求有
思路:有点小巨大的数学题。
首先有前置问题,求
然后就是求有
最后是
trick:与图计数的问题通常可以枚举 1 号点所在联通块满足什么条件进行转移。
1|28P8275 [USACO22OPEN] 262144 Revisited P
题意:定义一个序列的权值为:每次操作可以选择相邻的两个数并替换为两数最大值 +1,求一个序列的所有子区间的权值之和。
思路:抽象题。
首先是
设
记
当
接着有结论:所有答案为
记
证明:设
接着有两个优化:
优化 1:只维护所有极长的区间
此时有两种转移,
优化 2:若
这样复杂度就是
trick:分析合法情况的数量。
1|29[AGC032D] Rotation Sort
题意:给定一个排列,你可以花费
思路:自己口胡了一个类区间DP的东西。
正解:首先,每个数至多被移动一次,于是就只有被移动过的和未被移动过的两种,那么对于两个相邻的被固定了的数,他们中间的数的贡献就是确定的,然后就可以设计
trick:找性质来优化状态。
1|30[AGC055D] ABC Ultimatum
题意:称一个长度为
思路:对于判定是否合法有两种方向:DFA 和找充要条件。
于是就来找充要条件。
对于任意一个前缀,假设我们只用 BCA,CAB,那么 A 的数量一定不能超过 C 的数量,可是又有了 ABC ,于是就可以得出 A 的数量减去 C 的数量不超过 ABC 的数量。
于是大胆猜想,设
必要性是显然的,因为
接着就是充分性。对于第
于是就可以直接 DP,设
trick:对于判定是否合法有两种方向:DFA 和找充要条件。
1|31CF713E Sonya Partymaker
题意:一个长度为
思路:算是 Lanterns 的加强(?)版。
考虑二分答案,于是就变成了每个点覆盖范围一样的 lanterns。
先不考虑是环的情况,那么可以直接 DP,设
, 。 , 。 ,可以让 代替 往回, 。
然后考虑环上的情况。我们发现,如果选择两个距离最大的点断开就不会有影响。
再考虑 1 号点的情况。
- 向左走,那么
,要求 。 - 向右走且没走到 2,那么
,要求 。 - 向右走且走到 2,那么让 2 往回走显然更优,于是
,要求 。
trick:覆盖全集
1|32CF1149B Three Religions
题意:给定长度为
思路:状态基于
因为只用判断合法,我们可以设
trick : 判是否可行可以把一般状态的一维去掉,然后对剩余状态求出这一维的最小/最大值,再进行判断。
1|33CF1528E Mashtali and Hagh Trees
题意:一棵有向树称为
1.最长有向路径长度为
2.每个点的入度+出度
3.如果
给出
思路:大分讨题。
自己想到了几乎全部的做法,只不过不想分讨。
首先,发现最终树的形态是一个点为根,然后有不超过 3 棵子树,每棵子树都是根向/叶向树,然后最长有向链长度是
1|34P3336 [ZJOI2013] 话旧
思路:大分讨 DP。
设
,只能是 的线段; ,只能是 的线段;- 设
,可以根据这个推出锯齿形的方案数。
关于最大值,有些情况不合法,设成
1|35CF441E Valera and Number
题意:给出一个数
- 以
的概率对它乘以 。 - 以
的概率对它加上 。
求该数最终二进制下末尾
题意:发现 +1 操作可能造成进位,不好处理,于是考虑时间倒流,这样不会影响最低位的 0。
我们把末尾的操作看成
那么如果是
否则就是
这样就可以做到
trick:费用提前计算。
1|36P3600 随机数生成器
题意:给一个序列
思路:首先,如果一个区间完全包含了另一个区间,那它的最小值一定不大于它包含的区间的最小值,那么它就不做贡献。
如果直接求期望没什么好方法,我们考虑把它转化为一个计数问题,最后除以
设
然后考虑用 DP 算出
复杂度
trick:期望题目不仅可以用期望的线性性,还可以直接转成计数。
1|37CF115D Unambiguous Arithmetic Expression
题意:给一个不含括号的表达式,求有多少种方法给其加上括号使得其仍合法。
思路:好像区间 DP 减减枝可以过,但我没试。
设
然后考虑转移,方向是
先考虑
然后是
复杂度
trick:遇到合法括号串相关,可以把当前匹配完还剩多少左括号计入状态。
1|38P2612 [ZJOI2012]波浪
题意:定义一个排列的波动值为相邻两数之差的绝对值之和,求所有长为
思路:看到绝对值不好处理,一个常见的套路是考虑从小到大插入每个数依次计算贡献。我们发现一个数
1.
2.
3.
4.
5.
总复杂度
坑点:小数点后30位要用__float128,边转移边除以
trick:遇到绝对值可以考虑从小到大的插入来计算贡献。
1|39P3734 [HAOI2017]方案数
题意:一个人从
思路:考虑容斥,用全部的走法减去不合法的走法。先考虑怎么求全部走法。设
先把所有关键点按字典序排序,然后依次枚举每个障碍点
其中
复杂度
trick:正难则反。
1|40CF1268E Happy Cactus
题意:给定一个无向仙人掌,边权互不相同,定义
思路:首先考虑如果是一棵树怎么做。我们从大到小加边,设
然后考虑一般的情况。我们发现,有可能加边的两端已经互相可达,这时会出现重复,而这种情况只可能出现在最小边的两端可以合法到达最大边的环中,设最大边
trick:从特殊情况入手。
1|41CF1239E Turtle
题意:给一个
思路:先找一些性质。首先,假设选好了一行的数,那么肯定是第一行从小到大,第二行从大到小。
假设在第
接着,假设我们选定了
考虑优化。我们要让最大值最小,那么一定要让做贡献的数尽量小,所以一个很直观的想法是把最小值和次小值放在
复杂度
trick:贪心的思路在 DP 中经常出现。
1|42P1169 [ZJOI2007] 棋盘制作
题意:找到最大的 01 交替的子矩阵。
思路:悬线法模板题。
悬线的定义是每个点向上走直到遇到障碍或边界,那么每个点都对应着一条悬线,而且每条悬线对应着一个高度等于悬线高度的矩形。
悬线法就是找出每个点对应的悬线高度和能往左右最远能够拓展多少,思想和动态规划是类似的,就是求出当前行横向左右拓展多少,然后和上一行取个交,就是这个点对应的悬线可以拓展多少。
1|43P1758 [NOI2009] 管道取珠
题意:一开始,左侧上下两个管道分别有一定数量的两种小球,而右侧输出管道为空。每一次操作,可以从左侧选择一个管道,并将该管道中最右侧的球推入右边输出管道。假设上管道中有
思路:考虑
trick:贡献中含有平方可以考虑组合意义,就是两个人操作。
1|44[AGC016E] Poor Turkeys
题意:有
1.若
2.若
3.若
注意,第
求有多少个
思路:有一个很巧妙的状态:设
发现正着做不好确定,于是考虑时光倒流。
对于当前的火鸡
最终如果对于两只火鸡不存在另一只满足要这另一只被吃掉才能留下这两只,这两只就可以保留。
trick:如果要求的是两个元素能否留下,可以设计状态为如果要保留第一个,是否已经不能留下另一个。
1|45[AGC015E] Mr.Aoki Incubator
题意:数轴上有
初始时刻,你可以选择一些点为其染色,之后的行走过程中,染色的点会将其碰到的所有点都染上色,之后被染上色的点亦是如此
在所有
思路:假设按
此时可以发现
1|46CF983C Elevator
题意:一个 9 层的楼有一个可以容纳 4个人的电梯,你要管理这个电梯。
现在各层楼上有一些在排队的人,你知道他们在哪层要到哪层去。你也知道到电梯门口的顺序。根据公司的规定,如果一个人比其他人早到。他也必须先进电梯(无论楼层,只凭时间)。注意人们可以随时离开电梯。
电梯有两个命令:
- 上楼或者下楼, 代价为1
- 打开当前楼层的门,所有到目的地的人会从电梯里出来,当前楼层排队的人会在不违反规定的情况下一个一个进(在电梯还有空间的情况下)(这不是天朝的电梯,不能超员)每个人用1s时间来出入电梯。
最初电梯是空的,在1楼。你需要求出最少用多长时间来吧所有人送回到目的地。最后电梯可以停在任意位置
思路:设
1|47CF1566F Points Movement
题意:一个数轴上有
第
定义一条线段
你可以进行下面的操作任意次:
- 选择一个点
,并使 变为 两数中的一个,代价为 。
求使所有线段都被标记过的代价和最小值。
思路:首先,如果一个区间包含了另一个区间,那么可以不管这个区间。于是剩下来的区间的左右端点一定递增。
此时的局面一定形如是一堆点,一堆区间,再一堆点,一堆区间。一个点的轨迹一定是先往一边走,再掉头走回来到另一侧。同时,两点的轨迹不会重合,因此一个点的范围一定在上一个点和这个点的范围内,于是只考虑先哪边走,把最后往右的代价留到之后计算即可。
复杂度
trick:费用延后计算。
1|48P1973 [NOI2011] NOI 嘉年华
题意:给出一些区间,让你在这些区间中选出两组,两组区间不能有交。求:
① 让两份中分到区间数最小的一份,尽量得到更多的区间。
② 在第
思路:首先,区间可以离散化,于是预处理出来在
对于第一问,可以设
那么第一问的答案就是
然后考虑第二问。初步的想法就是钦定
这样一个区间的答案就是
现在问题是求
trick:决策单调性。
1|49P1864 [NOI2009] 二叉查找树
题意:给你一棵 treap,你可以通过改变树的形态使得树上所有节点子树访问次数和的和最小,改变形态有代价。
思路:根据二叉查找树的性质,这棵树的中序遍历就是所有点从小到大排序后的结果,而这是无法更改的,可以从这个方面入手。
题目中说可以让点权修改为任意实数,这就意味着可以有相同权值。把权值离散化一下就可以开始 DP 了。
设
trick:寻找不变量,在本题中 treap 不变的就是中序遍历
1|50P3643 [APIO2016] 划艇
题意:给出序列
思路:先考虑所有
考虑一般的情况,发现每个区间都是
trick:状态关于是关于一维的多项式,可以用拉格朗日插值优化。
1|51P3239 [HNOI2015] 亚瑟王
题意:给
思路:根据期望的线性性,可以把每个技能的期望加起来,那么可以转成求每个技能被使用的概率
对于第一个,不出的概率是
对于其他牌,因为如果选择了就会直接跳过,我们并不好直接处理。考虑设
现在考虑怎么求
如果最终没有选第
如果选择了,就有
复杂度
trick:期望的线性性。
1|52P3251 [JLOI2012] 时间流逝
题意:给定
0;否则你将等概率的获得一个元素,满足这个元素的价值不大于任何一个已经获得的元素的价值。求达到(或超过)给定的一个阈值 T 所需的期望步数。
思路:设
我们发现这个形式就是树上高斯消元的形式,可以套路的把
对于所有集合,我们发现我们只关心和以及最小值,那么可以在 dfs 时只维护这两个值,然后暴力搜索即可。
trick:如果消元的模型中具有唯一的前驱/后继,可以把一个元素表示成前驱/后继的线性组合,这样就可以递推出答案。
1|53P9522 [JOISC2022] 错误拼写
题意:给定字符串,长度钦定为
思路:设
然后考虑 DP。设
trick:转化限制。
1|54P7962 [NOIP2021] 方差
题意:给定长度为
思路:首先考虑这个操作的实质是什么。考虑原数列的差分序列,那么操作后的差分序列会从
设
于是就可以发现当
考虑设
- 放左边,有
- 放右边,有
这样做是
trick:对于无用的元素,可以直接去掉。
1|55P8290 [省选联考 2022] 填树
题意:给一棵树,每个点的点权要么是 0,要么是
思路:首先考虑朴素的暴力。我们枚举所有点权所在的区间
考虑优化。我们发现对于选择的区间
复杂度
trick:如果 DP 和值域有关,且可以看成一个多项式,那么就可以考虑用拉格朗日插值优化。
1|56[ARC098F] Donation
题意:给出一个
思路:重构树好题。
首先有一个性质,就是每个点只会在最后一次被经过的时候取到。于是我们设
接着考虑 DP。设
1|57CF1428G2 Lucky Numbers (Hard Version)
题意:定义一个数的权值为:若第
思路:首先发现一个数位上是 3 还是 6 还是 9 是没有影响的,所以可以把 6 和 9 当成 3 来处理(减小思维难度及码量)。
接着我们发现可以把这
再考虑剩下的一个数,就简单的当作一个分组背包来做,不过要注意这时也有可能还有 3的倍数的数位。
复杂度
trick:二进制优化多重背包。
1|58「JOISC 2014 Day2」邮戳拉力赛
思路:很神仙的 DP。
我们最优的做法肯定是会绕圈,但是根据贪心思想,绕圈的点是会贪心匹配的,就是说如果把下行到上行看成左括号,上行到下行看成右括号,那么最终一定是一组合法括号序,于是就可以用括号序上 DP 的常见套路,记
trick:匹配
1|59「JOISC 2015 Day2」Keys
题意:JOI 社有 N 个社员,从 1 到 N 编号。社员出勤时间从时刻 0 到时刻 M。保证在时刻 0 和时刻 M 的时候,全体社员都在公司内。
今天,每个社员会恰好离开公司一次。第 i 个社员会在时刻 S_i 时刻离开公司,会在 T_i 时刻回到公司。保证不会同时有 2 个人同时离开或者回到公司。
JOI 社会社大楼有一个大门作为入口,所有社员必须从这个门进出公司。在公司内部可以自由的打开或者关闭这个门。但是在公司外的话,必须有钥匙才能打开或者关闭这个门。在时刻 0,门是关闭的。因此,第 i 个社员能在 T_i 时刻回到公司,当且仅当在 T_i 时刻的时候门开着,或者他有钥匙。
进门的社员和出门且有钥匙的社员可以选择是否去关门。当没有钥匙的社员离开时,他们无法锁门。
现在你有 K 把钥匙,你需要把这些钥匙给其中 K 个社员,使得第 i 个社员在 T_i 时刻都能够进入公司,并且从 0 时刻到 M 时刻,门被关着的时间最大。
思路:挺不错的题目。
容易想到考虑每一段时间的贡献。假设这一段开始是员工 A,结束是员工 B,有 4 种情况:
- A 进来,B 出去,这一段时间直接可以关门;
- A 进来,B 也进来,那么无论 A 是否有钥匙,只有 B 有钥匙这一段时间才可以关门;
- A 出去,B 也出去,和上一种类似,无论 B 是否有钥匙,只有 A 有钥匙这一段时间才可以关门;
- A 出去,B 进来,那么只有 A,B 都有钥匙这一段时间才可以开门。
我们观察贡献的形式,发现是形如如果一个人有钥匙那么会有一些时间可以关门,两个人都有钥匙那么有一些时间可以开门,如果转到图上,就等价于每个点有点权,有一些带边权的有向边,我们要给 k 个点染色,要使被染色的点的点权和加上两端都被染色的点的边权和最大。
同时我们可以发现更强的性质。对于一个点,出边和入边最多只有一条,而且起始点和终止点的度数都是 1,换言之,这张图的每个联通块都是链,那么就可以直接 DP 了。
具体地,我们设
trick:用图论建模分析转移顺序。
1|60「JOISC 2015 Day 3」AAQQZ
题意:给定长为
很有意思的题目。
首先容易做到
我们先考察排序的区间和回文区间的关系。
- 如果两个区间无交,那么显然排序不会对回文串长度有影响。
- 如果排序区间包含了回文区间,那么答案就是最多的相同字符数,容易求出。
- 剩下的情况可以根据两个区间的中点的关系分成两种,这两种可以通过把回文串翻转来转化,于是只用考虑一种。
不妨设排序区间的中点在回文串中点右侧,根据排序区间和回文串右半部分的关系,可以分为 4 种,但这 4 种可以一起考虑。(下面的图都来自 官方题解)
具体地,对于前两种情况,我们枚举回文串中心,暴力往外拓展找最长的回文串,然后考虑两边的贡献;对于后两种情况,我们枚举排序区间左侧的前一个数作为的左端点,往右找到最近的比左端点前的数小的第一个数,那么最终回文串中心的一段都是这个数,然后再考虑两边的贡献。这时两种情况后面的处理大致相同了。
我们从左端往左找最长的不下降连续段,记录每个数的出现次数,然后从右端点开始往右扫。对于前两种情况,遇到小于左端点的数就停止;对于后两种情况,直到遇到比第一个遇到的比左端点小的数更小就停止。对于前两种情况,在扫描的过程中,两边的贡献就是右边从小到大第一个出现次数超过左边的数之前的数的个数;对于后两种情况,贡献就是比左端点小的数的个数加上右边从小到大第一个出现次数超过左边的数之前的数的个数(不算比左端点小的数)。
说起来比较抽象,看图就好理解了。
左侧有一个
需要注意的是对于第一种情况,排序区间的右端点往右的部分也可能和左边形成回文串,提前预处理出
复杂度
trick:讨论区间相对关系,分类解决。
1|61「JOISC 2015 Day 3」Card Game Is Great Fun
题意:有 N 张扑克堆成一个栈,从上往下第 i 张花色是
请问如何拿牌,才能使得拿出来的牌的价值和最大。
思路:直接 DP,我们维护当前栈的前 3 个和上一个取走的卡牌,记作
trick:分析性质简化状态。
1|62「JOISC 2016 Day 1」棋盘游戏
题意:JOI 君有一个棋盘,棋盘上有 N 行 3 列 的格子。JOI 君有若干棋子,并想用它们来玩一个游戏。初始状态棋盘上至少有一个棋子,也至少有一个空位。
游戏的目标是:在还没有放棋子的格子上依次放棋子,并填满整个棋盘。在某个格子上放置棋子必须满足以下条件之一:
这个格子的上下一格都放有棋子;
这个格子的左右一格都放有棋子。
JOI 君想知道有多少种从初始状态开始,并达到游戏目标的方案.
思路:很厉害的计数题。
先判断无解情况。如果 4 个角是空的或者第 1、3 行有连续 2 个空格就无解。这样第 1、3 行的空格就可以随意填了,相互之间没有影响。
从部分分入手。对于 subtask2,我们把空格形成的连通块拿出来,注意如果一个格子上下都有格子,那么也是可以随便填的,不能在连通块中,又根据无解的条件,可以发现现在最大的连通块大小也只有 5,可以直接暴搜,最后把所有连通块的答案拼起来。
我们还是从连通块入手。我们对第二行连续的空格求答案,然后组合起来。
设
- 第
列和第 列都是上下放置,转移就是 - 第
列左右放置,那么 要在 后面,有 - 第
列左右放置,那么 要在 后面,且 ,我们枚举第 列的 个空格有 个是在 之前放置,记之前的空格数是 , 表示 个棋子插入 个已放置的棋子中的方案数,有
复杂度
trick:分析性质,从特殊情况入手。
1|63「JOISC 2017 Day 3」长途巴士
思路:推出了最终会选择一些区间的性质,感觉可以
考虑
设
- 不把
赶下车,那么留下来需要喝 次水,转移是 ; - 把
赶下车,那么我们枚举赶下车的一段人 ,那么我们需要知道这些人最早可以在第几轮被赶下车,记为 ,那么有 ,转移就是 。
考虑怎么优化后一种转移。我们发现这就是斜率优化的形式,不过
trick:斜率优化。
1|64「JOISC 2018 Day 1」帐篷
思路:简单计数题。
显然可以想到按行 DP,然后维护当前还可以放帐篷有几列。设
- 这一行不放帐篷,
; - 这一行放两个帐篷,
; - 这一行放一个帐篷,且以后不会和其他帐篷在同一行,
; - 这一行和这一列之前一行放帐篷,
。
复杂度
1|65「JOISC 2018 Day 3」安全门
题意:一个括号串是好多当且仅当将一个子串取反后是合法括号串,现在有一个带通配符的括号串,求有多少个好多括号串可以匹配上。
思路:巨大 DP。
首先自然是把左括号看成 1,右括号看成 -1,那么条件就是翻转(同时反转)前后前缀和非负。
那么现在分成 4 种,两侧都合法,翻转前合法翻转后不合法,翻转前不合法翻转后合法,翻转前后都不合法。
第一种情况,等同于是合法括号串,容易
第二种情况和第三种情况本质相同。
记前缀和为
对于
记
于是可以枚举
最终答案是
然后是第四种情况。我们找到第一个
复杂度
trick:经典的把左括号看成 1,右括号看成 -1。
__EOF__

本文链接:https://www.cnblogs.com/Xttttr/p/18016693.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探