学习笔记 - 区间选择模型

Ref: https://www.luogu.com.cn/blog/_post/340543 ix35 咋这么厉害啊。

区间选择模型:

给定 \([1,m]\) 中的 \(n\) 个区间 \([l_i,r_i]\),每个区间选择一次的代价为 \(w_i\),最多可以选 \(c_i\) 次,要求使任意点 \(j\) 被覆盖的次数在 \([a_j,b_j]\) 之间,求代价最值。

不妨考虑一个区间 \([l_i,r_i]\),我们将 \(l_i\)\(r_i+1\) 连上一条边,其容量为 \(c_i\),代价为 \(w_i\)

同时在 \(1\sim m+1\) 处拉出一条链,\(S\) 连向 \(1\)\(m+1\) 连向 \(T\),考虑到 \(i\to i+1\) 这条边实际上表示了 \(i\) 不被区间覆盖的次数,假设最大流量为 \(X\),设 \(i\to i+1\) 上流了 \(f_i\) 的流量,那么 \(X-f_i\) 就是被区间覆盖的次数。

对于这样的边,我们设它的流量在 \([X-b_j,X-a_j]\) 之间,费用为 \(0\)\(S\to 1\)\(m+1\to T\) 则流量为 \(X\),费用为 \(0\),跑最小/最大费用上下界最大流即可。

时间复杂度 \(O(nm^2)\)

「网络流 24 题」最长 \(k\) 可重区间集

注意这里的区间是开区间,每个选择的代价是 \(w_i=r_i-l_i\),最多选择 \(c_i=1\) 次,\(b_j=k\)

\(X=k\),那么流量区间是 \([0,k]\) 内,可以直接跑最大费用最大流,问题解决。Link

NOI2008 志愿者招募

\([l_i,r_i]\)\([s_i,t_i]\)\(w_i\)\(c_i\)\(c_i\)\(+\infin\)

\([a_j,b_j]\)\([a_j,+\infin]\),设 \(X=+\infin\),那么流量在 \([0,+\infin-a_j]\) 之间,可以直接跑最小费用最大流,问题解决。Link

NEERC 2016 Delight for a Cat

先强制每个小时都睡觉,考虑睡觉修改成进食有什么变化。

一个时刻 \(i\) 进食的话,会影响区间右端点在 \([i,i+k)\),可以看做一个覆盖,对于一个位置 \(i\)\(i\ge k\)),其被覆盖的次数至多为 \(k-m_s\),至少为 \(m_e\)

\([l_i,r_i]\to [i,i+k)\)\(w_i\to s_i-e_i\)\(c_i\to 1\)

\([a_j,b_j]\to [m_e,k-m_s]\),设 \(X=k-m_s\),那么流量在 \([0,k-m_s-m_e]\) 之间,可以直接跑最大费用最大流,答案就是 \(\sum m_s+mcost\),可以根据满流构造方案。Link

posted @ 2022-06-27 17:43  时一月  阅读(165)  评论(0)    收藏  举报