当前位置: 首页 > news >正文

线段树二分

lc2286

线段树二分

class BookMyShow {
int n, m;
vector<int> mn;
vector<long long> sum;

// 把下标 i 上的元素值增加 val
void update(int o, int l, int r, int i, int val) {
if (l == r) {
mn[o] += val;
sum[o] += val;
return;
}
int m = (l + r) / 2;
if (i <= m) {
update(o * 2, l, m, i, val);
} else {
update(o * 2 + 1, m + 1, r, i, val);
}
mn[o] = min(mn[o * 2], mn[o * 2 + 1]);
sum[o] = sum[o * 2] + sum[o * 2 + 1];
}

// 返回区间 [L,R] 内的元素和
long long querySum(int o, int l, int r, int L, int R) {
if (L <= l && r <= R) {
return sum[o];
}
long long res = 0;
int m = (l + r) / 2;
if (L <= m) {
res = querySum(o * 2, l, m, L, R);
}
if (R > m) {
res += querySum(o * 2 + 1, m + 1, r, L, R);
}
return res;
}

// 返回区间 [0,R] 中 <= val 的最靠左的位置,不存在时返回 -1
int findFirst(int o, int l, int r, int R, int val) {
if (mn[o] > val) {
return -1; // 整个区间的元素值都大于 val
}
if (l == r) {
return l;
}
int m = (l + r) / 2;
if (mn[o * 2] <= val) {
return findFirst(o * 2, l, m, R, val);
}
if (R > m) {
return findFirst(o * 2 + 1, m + 1, r, R, val);
}
return -1;
}

public:
BookMyShow(int n, int m) : n(n), m(m), mn(4 << __lg(n)), sum(4 << __lg(n)) {}

vector<int> gather(int k, int maxRow) {
// 找第一个能倒入 k 升水的水桶
int r = findFirst(1, 0, n - 1, maxRow, m - k);
if (r < 0) { // 没有这样的水桶
return {};
}
int c = querySum(1, 0, n - 1, r, r);
update(1, 0, n - 1, r, k); // 倒水
return {r, c};
}

bool scatter(int k, int maxRow) {
// [0,maxRow] 的接水量之和
long long s = querySum(1, 0, n - 1, 0, maxRow);
if (s > (long long) m * (maxRow + 1) - k) {
return false; // 水桶已经装了太多的水
}
// 从第一个没有装满的水桶开始
int i = findFirst(1, 0, n - 1, maxRow, m - 1);
while (k) {
int left = min(m - (int) querySum(1, 0, n - 1, i, i), k);
update(1, 0, n - 1, i, left); // 倒水
k -= left;
i++;
}
return true;
}
};

http://www.jsqmd.com/news/226471/

相关文章:

  • 人机协作新模式:程序员与AI的共生关系
  • 构建高并发AI服务网关:C++与gRPC的工程实践
  • Java后端实习高频考点深度解析:美团27届后端开发二面全真复盘(限流·负载均衡·消息队列·链表分割)
  • AI 技能工程入门:从独立能力到协作生态
  • 提示工程架构实战:小样本场景下的模型压缩方案
  • 蟑螂的种类与预防方法
  • Java版LeetCode热题100之滑动窗口最大值:从暴力解法到工业级最优解的深度剖析
  • 大数据领域OLAP的用户权限管理
  • 蓝牙低功蓝牙LTK跟传统蓝牙LinkKey互转技术介绍,Cross-transport key derivation(CTKD)
  • 亚马逊Java后端开发一面深度复盘:16道系统设计与底层原理高频题全解析(附工业级解决方案)
  • 彼得林奇对公司并购后文化整合成功率的评估
  • MobaXterm高效运维实战技术文章大纲快速执行重复命令)
  • Hive执行模式对比:本地模式 vs 集群模式
  • 金融领域大数据文本挖掘实战案例解析
  • [Linux外设驱动详解]6. 中断处理
  • 国产麒麟系统卡启动项或图标如何解决
  • 基于职业发展的Python与Java深度对比分析
  • CAD(Creo)各模块的操作和配置
  • 速学!AI应用架构师分享金融市场AI监控系统的实时监控技术优化
  • RAR 、 ZIP、7z 之间的联系与区别
  • 主动学习在AI Agent训练中的应用
  • 工业协议全兼容:实时监控与智能控制
  • 吐血推荐MBA必用TOP10一键生成论文工具
  • 【电动机】液压伺服电动机的状态空间设计与仿真【含Matlab源码 14900期】
  • 【路径规划】基于matlab Fast-RRT二维空间移动机器人改进的运动规划器【含Matlab源码 14901期】复现含文献
  • 基于微信小程序的图书阅读系统【源码+文档+调试】
  • 导师不会告诉你的6款AI论文神器,一键生成超长篇!
  • DOL-CHS-MODS中文美化包:从零开始打造完美游戏体验
  • AO3镜像站技术指南:突破访问限制的完整解决方案
  • 【电动机】基于matlab液压伺服电动机的状态空间设计与仿真【含Matlab源码 14900期】