11.16

? t1

考虑性质:

\(a_{i-2}\) 以前的东西的放置情况对 \(a_i\) 的防止没有影响;\(a_{i-1}\) 至多放到 \(i\)

相同的 \(a_i\) 出现间隔不超过 \(3\)

所以可以细致讨论 \(a_i\)\(a_{i-1}\) 的相对放置情况,根据 \(a_i,a_{i-1},a_{i-2}\) 的相等情况转移。

dp 还是要挖掘什么东西是你需要记录的,什么东西是无关的,可以不管它;要挖掘性质。

? t3

由于是博弈题,双方都知道最优策略,所以应当从后往前 dp

然后决策其实不一定关心到底是谁在决策,可以认为先手在决策即可;定义和转移是容易,最后能优化成 \(mx = \max(mx,k_i-mx)\) 的形式,注意到 \(\sum a_i \leq 10^6\),并且能更新 \(k_i\)\(mx\) 递增,同时能更新 \(mx\)\(k_i\) 必然第一次出现;所以可以把每个 \(mx\) 挂到全局对应的 \(k_i\) 上,然后对每颗树做 dfs 即可。

启示:博弈题应当考虑从后往前推;对于比如像位置之类不好刻画的局部限制可以考虑进一步发掘性质,能不能直接丢掉;

? t4

形如有一个目标:把 \(a_i\) 弄到 \(b_i\),可以考虑将 \(a_i\)\(b_i\) 连边,然后在图上考虑。

比如这题建完图后,相当于如果出度大于 \(2\) 才可以动;并且最终必须要至少有一个入边被用了,才能把所有出边都使用。

所以 \(in_x = 0\) 但是 \(ou_x \gt 0\) 不合法。

不妨丢掉 【某个球可以临时帮助别的点】 的限制,先对每个联通块考虑。

发现一个连通块合法等价于存在一个点的出度大于 \(2\)

由于不存在入度为 \(0\) 的点,所以整张图必然由若干强连通分量(不是单点) + 联通分量之间的边构成。

当只有一个联通分量时,显然成立;当不只一个连通分量时,本身就一定合法,并且满足上述条件。

然后考虑怎么帮助别人?

显然要对每个球考虑,因为你关心它们的次数。

根据是否需要帮助和是否是自环边考虑,可以依次得出其帮助别人的代价和贡献。

免费的贪心选,剩下的有两种不同的代价,枚举掉一种,剩下贪心选;

特判一些特殊情况。

CF1542D Priority Queue

交换枚举对象。考虑每个数能被多少方案数计数。

然后只有比这个数小的数有用。

数相同钦定删除的是位置较小的数。

CF1542D Priority Queue

又读错题了,反思。

预处理每个数向左推能推倒到的位置 \(l_i\),向右推能推倒到的位置 \(r_i\),这可以单调栈。

考虑定义 \(f_i\) 表示前 \(i\) 个位置被推到的最小代价。

枚举第 \(i\) 个元素是被向右推到还是其向左推倒,有:

\(f_i = \min_{r_j \geq i}\{f_{j-1}+w_j\}\)

\(f_i = \min_{l_i \leq j}\{f_{j-1}\}+w_i\)

注意到第二个转移取 \(j = l_i\) 最优秀,因为往左推两次必然不如往左推一次;

考虑 \(r_i\) 的性质,\([i,r_i]\) 必然包含或者不交。

所以把 \([i,r_i]\) 向第一个包含其的区间连边;转移相当于一个树上 dfs 的过程,取的是祖先 \(\min\)

思考:区间不交具有良好的性质,做题可以关注区间之间的关系。

CF1781F Bracket Insertion

考虑括号序列合法如何刻画。

套路地,给 ( 赋权值 1) 赋权值 -1,则有括号序列合法等价于 【前缀和非负】和【整个序列权值和为 0】。

这题后面的限制显然满足,只考虑前者即可。

然后考虑往某个位置插入 () 和插入 )( 等价于暂时抬升/降低初始前缀和。

不妨定义 \(f_{i,x}\) 表示初始前缀和为 \(x\) ,操作 \(i\) 次的答案。

转移时枚举第一次操作放入的元素,转移是容易的。

然后提取公因式,预处理后面的项。

思想:括号序列赋 1/-1,合法转化为对前缀和的限制;dp 转移的顺序很重要!!比如存在若干不合法经过点枚举第一个经过的不合法点,从 \(n-1\) 次操作转换为 \(n\) 次操作枚举第一次操作(好像不止这题)。

CF1140G Double Tree

考虑换树的限制,发现从 \(x\) 换到 \(y\) 和从 \(y\) 换到 \(x\) 没有本质区别,所以可以一起考虑。

类似
某道神秘题

就是换根的思维。

可以先求出在只考虑子树的换树最小代价 \(f_x\) 和全局换树的最小代价 \(g_x\);然后发现求出后者后没有保留前者的必要(又没有带修)。

前者自下而上更新;后者可以在求出前者的基础上自上而下更新。

然后就可以像普通树一样正常考虑了,上一个倍增,就做完了。

思维:树上求关于点 \(x\) 的全局最优化某个东西(比如随便经过若干其它点,从 \(l_x\)\(r_x\) 的最短路之类的),可以先求出只考虑子树内的答案,再扩展到整个树。

CF1279F New Year and Handle Change

学习了 wqs二分

具体地,形如 给定若干个物品,要求恰好进行 m 次操作,最大化或最小化操作后的价值(根据题目计算) 问题,一般还有特征:答案随操作次数单调,不限制操作次数容易求解,就可以使尝试用 wqs 二分。

可以二分每个操作的“惩罚权值” \(w\),找到在最优化答案的前提下恰好进行了 \(m\) 次操作的 \(w\),取该惩罚权值下的答案即可。

正确性可以考虑一个 \((x,f(x))\) 形成的凸壳,对于每个斜率 \(k\),都有切点 \((x',f(x'))\) 处常数项 \(b\) (即惩罚后答案)最大/小。

所以上述操作相当于在找切点 \((x',f(x'))\)

然后注意到 \(k\) 越大,\(x'\) 越大,所以可以二分 \(k\) 可以找到答案的 \((x',f(x'))\)

这题可以被转化为至多选择 \(k\) 个长度为 \(l\) 的子区间置权值 \(0\),最小化整个序列的权值和。

CF1372E Omkar and Last Floor

首先有结论:把 \(1\) 尽可能放到一列更优。

所以答案可以表达成【给每个列附优先级,然后贪心放置 \(1\)】。

由于数据范围较小由于某一列被用后,与其有交的区间就都被用过了,所以答案相当于再加上两个子区间的答案;所以考虑区间 dp

转移是容易的。

类似的还有 P4766 [CERC2014] Outer space invaders

考虑区间内存在一炮距离大于等于 \(d_i\) 的限制。

不妨从大到小考虑限制,每次枚举一个位置放炮,然后把与其有交的区间都扔掉;发现去掉断点后所需解决的区间就无交了;所以考虑区间 dp

思想:如果时间复杂度很像 \(O(n^3)\),并且大区间的答案能由子区间的答案合并而来(上述两题都是考虑完断点之后,所需区间无交;当然还有直接合并两个区间之类的),就可以考虑区间 dp

posted @ 2025-11-20 07:54  rabbit_mygo  阅读(53)  评论(0)    收藏  举报