2025/02/05 (贪心 凸性 拟阵)
n≤5×104。
按右端点从小到大排序,依次考虑每一个区间,能选则选。复杂度
O(nlogn)。
n 个区间,选出尽可能少个区间覆盖
1∼m。
按左端点从小到大排序,每次选出最长前缀。具体实现相当于每次求
l≤x 的最大的
r,因此不妨把右端点挂到左端点上,维护前缀最大值即可。有较多细节。复杂度
O(nlogn)。
* 区间选择模型 III。
n 个点
m 个区间,选出尽可能少个点覆盖所有区间。
n,m≤106。
去掉所有包含其他区间的区间。区间按左端点从小到大排序。从小到大依次考虑每一个点,能不选则不选。复杂度
O(nlogn)。
* 前缀匹配模型。
n+m 个点的二分图,左侧第
i 个点与右侧第
1∼pi 个点连边。求最大匹配。
以任意顺序考虑左侧第
i 个点,选择右侧
pi 之前编号最大的未匹配点与之匹配。复杂度
O(nlogn)。
* 区间匹配模型。
n+m 个点的二分图,左侧第
i 个点与右侧第
li∼ri 个点连边。求最大匹配。
n,m≤106。
从小到大考虑右侧每一个点,选择左侧能与之匹配的点中
ri 最小的点进行匹配。复杂度
O(nlogn)。
* 二维前缀匹配模型。
n+m 个点的二分图,左侧第
i 个点与右侧第
j 个点连边,其中
j 满足
xj≤ai 且
yj≤bi。求最大匹配。
按
x 坐标扫描线,扫到右侧点时加入按
y 排序的 multiset,扫到左侧点时选择能匹配的
y 最大的右侧点。复杂度
O(nlogn)。
* 带点权前缀匹配模型。
n+m 个点的二分图,左侧第
i 个点与右侧第
1∼pi 个点连边。右侧点有点权
aj。求点权和最大的匹配。
按点权从大到小考虑右侧每一个点,选择左侧能与之匹配的
pi 最小的点与之匹配。复杂度
O(nlogn)。
邻项交换模型。
给定
n 个 01 序列
ai,将他们以任意顺序拼接,最小化逆序对数。
考虑何时交换相邻两段更优。令
s0(i) 表示
ai 中 0 的个数,
s1(i) 同理。
发现交换只影响两段之间的逆序对,段内部的逆序对仍然存在。因此,当且仅当
s1(i)×s0(i+1)>s1(i+1)×s0(i) 交换更优。变形得
s0(i)s1(i)>s0(i+1)s1(i+1)。不妨按
s0(i)s1(i) 从小到大排序即可。
n 个点的有根树,有点权
ai∈{0,1}。每次可以选择没有父亲的点删除,并且其点权加入序列末尾。最小化序列逆序对数。
n≤2×105。
不妨扩展成点权为 01 序列。由上题结论,对于当前全局
s0(i)s1(i) 最小的点
x,一定会在父亲被删除后立即被删除。因此,不妨将其与其父亲合并。如此不断合并,当只剩一个点时即可得到答案。用堆和并查集维护。复杂度
O(nlogn)。
* 最小化字典序模型。
n 个奖池,第
i 个奖池的奖金是
pi,其他人已押入
li 张彩票。
t 张彩票,将彩票分配到这些奖池中,需要保证你在第
i 个奖池中押入的彩票数
ti 不能超过
li。对于第
i 个奖池,中奖概率为
ti+liti。若中奖,则获得这个奖池的全部奖金
pi。
q 次事件,每次事件会使某个
li 加
1 或减
1。询问在最佳分配方案下获得的奖金总数的最大期望值。
n,t,q≤2×105,
pi,li≤103,答案精度误差
≤10−6。
对于每个奖池,注意到
fi(x)=x+lix⋅pi 是凸的,因此答案即为这
n 个凸函数
(min,+) 卷积的第
t 项。
对于一组询问,只需用堆维护每一个奖池多放一张期望的增量,模拟贪心即可。复杂度
O(q⋅n)。
* 可以证明,每次修改后
ti 至多只会变化
1。因此,用堆维护已经放置的彩票中期望增量的最小值和能够放置的最大值即可。复杂度
O((q+n)logn)。
题意较复杂,不多赘述。
* 一组询问实际上就是最大权匹配模型,按顺序交错排列这些菜即可转化为后缀匹配,可贪心的从后向前考虑每一天,售出当前价格最高的蔬菜。
思路来自 gcz,拜谢。
n 个二元组
(vi,wi)。对于正整数
s,执行操作:
- 对于每个二元组,记 fi(s) 表示二进制下的 s bitand wi 中 1 的个数,则令 vi←(−1)fi(s)⋅vi。
构造
s,使得操作前后
∑vi 符号相反。
n≤3×105。
不妨令
∑vi 初始为正。如果为负,将
vi 全部取反是等价的。设
anss 表示选定
s 进行操作的答案,我们只需找到一个
anss>0 即可。
而根据题意,有:
anss=i=1∑n(−1)fi(s)⋅vi
注意到:
s=0∑262−1anss=s=0∑262−1i=1∑n(−1)fi(s)⋅vi=i=1∑ns=0∑262−1(−1)fi(s)⋅vi
又注意到,
(−1)fi(s)+(−1)fi(s bitxor 1)=0。这是因为
s 和
s bitxor 1 仅在最低位有区别,因此二进制下
1 的个数一奇一偶。因此,有:
s=0∑262−1anss=i=1∑ns=0∑262−1(−1)fi(s)⋅vi=i=1∑n0=0
记
d(l,r)=i=l∑ranss。上面的观察告诉我们,
d(0,262−1)=0。发现可以二分,
d(0,261−1) 和
d(261,262−1) 必定一正一负,并且负的区间中必定存在一个
anss<0。特别的,若两个区间和均为
0,由于
ans0>0,因此左半区间一定存在
anss<0。于是,现在的问题变为如何快速计算
d(l,r)。
由于二分的特殊性,不难发现,我们所要计算的区间
[l,r] 都一定是二进制下一个前缀固定,剩下部分任取。与上面同理,我们不难得到:
d(l,r)=i=1∑ns=l∑r(−1)fi(s)⋅vi
因此,我们需要解决的问题是,对于每个
i,求所有二进制下前缀是某个定值、后面任取的
s 的
f(s,i) 之和。设固定的前缀长度为
t,若
wi 在前
t 位外仍有
1,则显然贡献会两两抵消,答案为
0。否则直接计算即可。
复杂度
O(nlog2V)。
题意较复杂,不多赘述。
考虑奶牛走的路线必定如下图所示。
To be continue.
To be continue.
To be continue.
2025/02/06 (DP 及其优化)
n 个集合
Si,满足
Si⊆[1,m]∩Z。其中有些集合未确定,你可以自行钦定。
设可重集
T,初始为
∅。依次遍历每个集合,同时向
T 中加入
Si 中的所有元素。若
T 包含重复元素,则令
T←∅。
钦定未确定的集合,求
∣T∣ 的最大值。
n,m≤2×105。
令
fi 表示能否使得
T 经过
Si 后恰被清空。
显然,若
ki=0,则
fi=1。否则,考虑枚举上一次被清空的位置
j,若存在
j 满足:
- 位置 j 可被清空,即 fj=1;
- 区间 (j,i) 中无重复元素,即 j<k<i⋂Sk=∅;
- 到位置 i 时有重复元素,即 (j<k<i⋃Sk)∩Si=∅。
发现满足第二条的
j 是一段后缀,而满足第三条的
j 是一段前缀。* 具体求解可使用双指针和桶。我们只需要求这一段前缀和后缀的交中,是否存在
fj=1。因此,我们只需维护
gi 表示
i 之前最近的
fj=1 的位置,判断是否有
gr≥l 即可。
求解答案时,我们找到最长的后缀
[l,n] 使得其中无重复元素。则
n 件物品,背包体积为
A,有
B 个货币。第
i 个物品价值
pi,体积
ai,每用
bi 个货币可以使其体积减少
1。求最大价值。
n,A,B≤2×103。
题目分为两步:选出一些人来贿赂,以及给这些人分配冰淇淋。
第二步是容易的,贪心的给
xi 较小的人即可。按
xi 从小到大排序。故必定存在一个分界点,前面只用冰淇淋,后面只用牟尼,而这个处于分界点的人可能需要混合使用冰淇淋和牟尼。
因此,不妨设
fi,j 表示前
i 个人只用
j 个冰淇淋能得到的最大受欢迎度,而
gi,j 表示后
i 个人只用
j 个牟尼能得到的最大受欢迎度。
统计答案时,枚举分界点处的第
i 个人用
a 个牟尼,计算出其还需要
b 个冰淇淋,则用
fi−1,B−b+gi+1,A−a+pi 更新答案即可。
复杂度
O(n2)。
长为
n 的序列
ai,消除长为
x 的连续同色段的分数为
x2。求最大分数。
考虑一个朴素区间 dp,设
fl,r 表示区间
[l,r] 的最大答案。转移时考虑枚举最后一次消除的编号,则有:
fl,r=l≤i1<i2<⋯<ik≤rmax{fl,i1−1+fi1+1,i2−1+⋯+fik+1,r+k2}
m 个三元组
(ai,bi,ci)。构造长为
n 的序列
{pn}。若
ai≤j≤biminpj≤ci 则产生
ai≤j≤biminpj 的贡献,否则没有贡献。试最大化贡献。
n≤50,
m≤4×103。
设
fl,r,k 表示只考虑
[ai,bi]⊆[l,r] 的约束,且
[l,r] 中的最小值至少为
k 时的最大收益。
fl,r,k=l≤p≤rmax{fl,p−1,k+fp+1,r,k+cnt(l,r,p,k)⋅k}
其中
cnt(l,r,p,k) 表示满足以下条件的三元组数量:
- [ai,bi]⊆[l,r];
- p∈[ai,bi];
- ci≥k。
不妨离散化,仅需考虑
k 为
ci 之一。
如何计算
cnt 函数?考虑容斥,不妨预处理
sl,r,k 表示满足以下条件的三元组数量:
- [ai,bi]⊆[l,r];
- ci≥k。
则有:
cnt(l,r,p,k)=sl,r,k−sl,p−1,k−sp+1,r,k
如何处理
s 数组?显然可以差分,将
ci≥k 转化为
ci=k。此时即为一个二维数点问题,无需数据结构优化,直接暴力即可。复杂度
O(n2m)。
总复杂度
O(n3m)。
有长为
n 的值域为
[1,k] 的序列
{an},其中有些位置未填。填入这些数使得不存在长为
l 的连续同色段,求方案数。对
998244353 取模。
n≤105,
k≤100。
设
fi,j 表示考虑了前
i 个数并且
ai=j 的合法方案数。令
si=1≤j≤k∑fi,j。
根据定义,若
ai=−1,则
fi,ai=1。
To be continue.
斜率优化
决策单调性
凸优化。
2025/02/07 (模拟赛 树)
2025/02/08 (链剖 树上启发式合并 Prufer 点分治 边分治)
2025/02/09 (模拟赛 线段树)