1 条题解
-
0
核心思路
1. 约束转化
对于每个员工 ,定义:
- : 必须与 同组的最小编号
- : 必须与 同组的最大编号
- : 不能与 同组的最小编号
- : 不能与 同组的最大编号
代码中用:
l[i].fir= 必须同组的最小右边界l[i].sec= 不能同组的最小右边界r[i].fir= 必须同组的最大左边界r[i].sec= 不能同组的最大左边界
2. 约束处理规则
对于约束 :
-
(必须同组):
- 若 :必须包含 区间 → 更新
r[x].fir = max(r[x].fir, y) - 若 :必须包含 区间 → 更新
l[x].fir = min(l[x].fir, y)
- 若 :必须包含 区间 → 更新
-
(不能同组):
- 若 :不能包含 区间 → 更新
r[x].sec = min(r[x].sec, y) - 若 :不能包含 区间 → 更新
l[x].sec = max(l[x].sec, y)
- 若 :不能包含 区间 → 更新
3. 动态规划状态
设 表示考虑前 个员工的最大总效率。
转移: [ f[i] = \max_{0 \leq j < i} { f[j] + \text{sum}(j+1,i) } ] 其中 是区间 中所有约束被满足的员工的效率之和。
4. 线段树优化
关键观察:对于区间 ,员工 被满足当且仅当:
- 且 (必须同组约束满足)
- 且 或 (不能同组约束满足)
代码用扫描线 + 线段树维护:
- 当右端点 扫描时,将满足条件的区间加入
- 线段树维护每个左端点 对应的
- 用
mxv[1]获取当前最大
5. 算法流程
- 初始化约束边界
- 扫描线处理:
ins[i]: 当右端点 = i 时开始生效的约束del[i]: 当右端点 = i 时失效的约束
- 线段树更新:
- 对每个生效约束,在左边界处加减效率值
- 查询全局最大值得到
- 状态转移:
- 用于更新后续状态
- 通过
modify(i, -f)和modify(i+1, f)实现
重要公式
-
DP 转移: [ f[i] = \max_{0 \leq j < i} { f[j] + S(j+1,i) } ] 其中 是区间 中有效员工的效率和。
-
约束条件:
- 必须同组:$l_{\text{min}} \leq \text{left} \leq x \leq \text{right} \leq r_{\text{max}}$
- 不能同组: 或
-
线段树维护:
sum[p]: 区间和mxv[p]: 区间最大后缀和- 合并:
mxv[p] = max(mxv[lp] + sum[rp], mxv[rp])
复杂度分析
- 约束处理:
- 扫描线:
- 线段树操作:
- 总复杂度:
- 1
信息
- ID
- 3984
- 时间
- 500ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者