1 条题解
-
0
题目理解
我们有 幅画,每幅画有美感值 ,需要将它们排列成一排。有 家杂志按影响力降序排列,每家杂志会拍摄一个区间 ,其文章吸引力是该区间内画作美感值的最大值。
目标:安排画作顺序,使得杂志的文章吸引力序列 的字典序最大。
关键观察
-
字典序最大化策略:优先让影响力最高的杂志获得尽可能大的吸引力值,然后是第二高的,依此类推。
-
美感值分配:为了最大化 ,我们需要将最大的美感值放在某个杂志 1 的覆盖区间内。但要注意,这个最大值可能被多个杂志共享。
-
区间覆盖关系:杂志的区间可能有重叠,需要协调安排。
算法思路
核心思想:从大到小分配美感值
我们按美感值从大到小处理,对于每个美感值 ,考虑如何分配给杂志:
- 确定可用的杂志:找出所有尚未确定吸引力值且区间内可以放置美感值 的杂志
- 贪心选择:选择这些杂志中影响力最高的若干个来分配美感值
- 更新覆盖:分配后更新相关区间的状态
数据结构设计
代码中使用了多种数据结构:
- 双向链表
List:维护尚未分配吸引力值的杂志列表 - 线段树
SGT1, SGT2, SGT3:SGT1:按左端点存储杂志ID,用于查询覆盖某个位置的杂志SGT2:按右端点存储杂志IDSGT3:存储(负右端点, 杂志ID),用于快速找到覆盖区间最广的杂志
- 树状数组
BIT:维护区间覆盖信息,用于快速更新和查询
主要流程
void solve(int v, int cnt) { // 1. 确定最多可以分配v给多少个杂志 int len = 通过二分查找确定; // 2. 选择影响力最高的len个杂志 auto vid = list.getid(len); // 3. 更新这些杂志的答案为v for (auto i : vid) res[i] = v; // 4. 处理区间覆盖的连锁反应 // 当一个杂志获得答案v后,可能影响其他覆盖关系 }算法详解
步骤1:确定可分配数量
对于美感值 ,我们有
cnt[v]个该值的画作。我们需要确定最多可以分配给多少个杂志:// 倍增 + 二分查找确定最大len int len = 通过calc函数计算;calc函数计算:如果选择前k个杂志,最少需要多少个不相交的区间来覆盖它们。步骤2:贪心选择
选择影响力最高的
len个杂志来分配美感值 :auto vid = list.getid(len); for (auto i : vid) del(i); // 从待处理列表中移除步骤3:处理覆盖关系
当一个杂志获得答案 后,需要检查:
- 是否有其他杂志的区间完全被已分配杂志覆盖?
- 是否有杂志的区间可以扩展到获得更大的值?
这部分通过线段树和优先队列来高效处理。
时间复杂度
- 对于每个美感值 ,处理时间为
- 总复杂度:
算法正确性
- 字典序最优:总是优先为影响力高的杂志分配尽可能大的值
- 资源约束:考虑每个美感值的数量限制
- 覆盖协调:通过区间覆盖分析确保分配方案可行
算法标签
- 贪心算法
- 字典序最大化
- 数据结构优化
- 线段树
- 树状数组
总结
这道题的关键在于理解字典序最大化的贪心策略,并结合区间覆盖的特点设计高效算法。通过从大到小处理美感值,并利用数据结构维护杂志的覆盖关系,实现了在 时间内求解最优安排。
-
- 1
信息
- ID
- 3842
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者