JOISC2019E 两道料理(Two Dishes)

news/2025/2/21 20:33:33/文章来源:https://www.cnblogs.com/dcytrl/p/18725904

题意

有两种菜,第一种菜有 \(n\) 个步骤,有花费时长 \(ta_i\),限制 \(la_i\),价值 \(wa_i\);第二种菜有 \(m\) 个步骤,有花费时长 \(tb_i\),限制 \(lb_i\),价值 \(wb_i\)

对于一种菜的步骤 \(i\),他需要完成该菜的步骤 \(1\sim i-1\) 才能进行该步骤。而你需要规划做这两道菜的步骤(两道菜的步骤可以交替进行),对于第一道菜的每个步骤 \(i\),若你在 \(la_i\) 时刻时已经完成了步骤 \(i\),那么你会获得 \(wa_i\) 的收益;第二道菜同理。你需要最大化做完这 \(n+m\) 个步骤后的收益和最大值。

\(n,m\le 10^6,|wa_i|,|wb_i|\le 10^9\)

分析

\(f_{i,j}\) 表示第一道菜做了 \(1\sim i\) 步骤,第二道菜做了 \(1\sim j\) 步骤的最大收益。转移显然。

一个显然的性质:如果要获得 \(wa_i\) 的贡献,那么第二道菜必须完成不超过 \(pa_i\) 个步骤。对于 \(wb_i\) 同理,我们也有一个 \(pb_i\)

扫描线 \(i\),考虑用数据结构维护 \(f_{*,j}\)。考虑将 \(wa_i,wb_i\) 的贡献在加入 \(a_*\) 时计算:

  • \(wa_i\) 的贡献,考虑先将 \(wa_i\) 加入 \(ans\) 中,当加入 \(a_i\) 时,若已经选了 \(b_{pa_i+1}\) 则有 \(-wa_i\) 的贡献。
  • \(wb_i\) 的贡献,考虑当加入 \(a_{pb_i+1}\) 时,若已经选了 \(b_i\),则有 \(wb_i\) 的贡献。

这样我们就相当于在加入 \(a_i\) 时会对 \(f_{*,j}\) 的一段后缀加,加完后令 \(f_{*,j}\) 取前缀最大值。

考虑差分,那么后缀加就相当于单点加,前缀最大值相当于前缀和最大值。考虑用 map 维护差分,那么 \(f_{*,j}\) 的值就是下标 \(\le j\) 的点值和。

若加入了一个非负数,那么直接加显然没问题。否则,将加入的这个数与下标在其之后的差分值兑掉,如果差分值归零那么删掉这个位置,否则加入的值归零,差分值会相应的减少,然后退出。如果加入的值把其之后的差分值都兑掉了,那么最后就不加入 map。注意到若先负后正那么负数的贡献会被错误的少加入,所以要先正后负。由于差分值只会被加一次删一次,总复杂度 \(O(n\log n)\)

int n,m;
int ta[maxn],la[maxn],wa[maxn],sa[maxn];
int tb[maxn],lb[maxn],wb[maxn],sb[maxn];
vector<pii>v[maxn];
map<int,int>f;
int ans;
void ins(int x,int val){if(val>=0)return f[x]+=val,void();for(auto it=f.lower_bound(x);it!=f.end();it=f.erase(it)){int id=it->fi;if(it->se+val>=0){f[id]+=val;return;}else{val+=it->se;}}
}
inline void solve_the_problem(){n=rd(),m=rd();rep(i,1,n)ta[i]=rd(),la[i]=rd(),wa[i]=rd(),sa[i]=sa[i-1]+ta[i];rep(i,1,m)tb[i]=rd(),lb[i]=rd(),wb[i]=rd(),sb[i]=sb[i-1]+tb[i];rep(i,1,n)if(la[i]>=sa[i]){int ps=upper_bound(sb+1,sb+m+1,la[i]-sa[i])-sb;ans+=wa[i];if(ps<=m)v[i].emplace_back(mp(ps,-wa[i]));}rep(i,1,m)if(lb[i]>=sb[i]){int ps=upper_bound(sa+1,sa+n+1,lb[i]-sb[i])-sa;if(ps<=n){v[ps].emplace_back(mp(i,wb[i]));}else{ans+=wb[i];}}rep(i,1,n){sort(all(v[i]),[](pii x,pii y){return x.se>y.se;});for(pii _:v[i]){int x=_.fi,val=_.se;ins(x,val);}}for(auto i:f)ans+=i.se;write(ans);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/887050.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

制造行业CRM选哪家?中大型企业CRM首选纷享销客

在当今竞争激烈的制造行业中,企业对于客户关系管理(CRM)系统的需求日益增强,高效、智能的CRM系统已成为推动企业业务增长、优化客户体验的关键。在众多CRM解决方案中,最终纷享销客凭借其卓越的功能性、高度的定制化能力以及出色的市场表现,成为了众多中大型企业首选的CRM…

6.2.6 特征映射和感受野

这里看英文原版更好语句更通顺,还有补充上面的图片其实就是想说明低层的CNN可以检测边缘什么的(右侧图像是中间的图像与左侧图像做卷积的结果)

MQ基础

MQ基础认识MQ结合JAVA客户端 依赖 <!--AMQP依赖,包含RabbitMQ--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency>配置文件 spring:rabbitmq:host: 8.2…

Excel 自动换行后批量设置单元格上下边距

excel 自动换行后 单元格的上下边距挨的很紧,看起来很不舒服 如下图 现在教大家 如何批量设置 单元格中有多行文本后的上下间距,设置成功后 如下图所示:具体步骤: 1、鼠标悬停在 excel 中的任意sheet(页签)上,右键 选择 查看代码 2、在弹出的 Visual Basic 编辑器弹框左…

开发者必备!Github Stars 存储库管理器!

gitstars —— 一个基于 Vite + Vue.js 构建的 GitHub Star 仓库管理器,旨在帮助开发者更好的管理、搜索、查阅收藏的开源项目。大家好,我是 Java陈序员。 Github 作为全球最大的开发者交流平台,拥有数不胜数的开源项目,我们会经常收藏一些开源项目,方便工作和学习。 但随…

1. Linux下 MySQL 的详细安装与使用

1. Linux下 MySQL 的详细安装与使用 @目录1. Linux下 MySQL 的详细安装与使用1. Linux 下安装 MySQL8.0 的详细安装步骤:2. Linxu 当中的MySQL 设置远程登录3. 最后:1. Linux 下安装 MySQL8.0 的详细安装步骤:查看是否安装过MySQL,如果你是用rpm安装, 检查一下RPM PACKAGE:…

临时编辑-----WordPress后台用户手册

登录 WordPress后台默认的登录链接是: https://yourdomain.com/wp-admin/ 输入你的账号(可以是邮箱,也可以是昵称)和密码,即可登录。然后就会进入到你的WordPress网站后台。 注意:忘记你的WordPress密码也不用太慌张,可以从服务器后台进入到WordPress后台。 进来的界面就…

15. Docker容器监控之(CAdvisor+InfluxDB+Granfana)的详细安装和常规使用

15. Docker容器监控之(CAdvisor+InfluxDB+Granfana)的详细安装和常规使用 @目录15. Docker容器监控之(CAdvisor+InfluxDB+Granfana)的详细安装和常规使用1. CAdvisor监控收集+InfluxDB存储数据+Granfana展示图表 的概述1.1 CAdvisor 监控收集1.2 InfluxDB 存储数据1.3 Granfana…

c#中GDI+使用贝塞尔曲线画一朵云

主要是路径的计算 先得到路径if (value.Width > 0 && value.Height > 0) {GraphicsPath.AddBezier(new PointF(RectangleF.Left + RectangleF.Width * 0.1f, RectangleF.Top + RectangleF.Height * 0.55f),new PointF(RectangleF.Left + RectangleF.Width * 0.1f…

如何让你的ida 地址就是RVA

如何让你的ida 地址就是RVA 原理:首先软件进入ida中的时候,其实就相当于把应用程序载入了内存中,RVA其实就是虚拟的便宜地址,也就是在内存中的地址,所以这里的RVA就是在ida中看到的地址-Imagebase Imagebase 其实就是基址。所以我们只需要把imagebase 设置为0即可拿到我…

c#GDI+实现类似油门踏板效果的自定义控件

先看效果图下面是代码protected override void OnPaint(PaintEventArgs e) {e.Graphics.SetGDIHigh();var rect = new Rectangle(0, 0, this.Width, this.Height);// 创建变换矩阵Matrix transformMatrix = new Matrix();// 使用平行四边形的方法近似梯形transformMatrix.Shear…

NocoBase 本周更新汇总:支持全局和批量数据触发自定义操作事件

本周更新包括:支持全局和批量数据触发自定义操作事件,支持数据表预置字段扩展等。汇总一周产品更新日志,最新发布可以前往我们的博客查看。 NocoBase 目前更新包括的版本更新包括三个分支:main ,next和 develop。main :截止目前最稳定的版本,推荐安装此版本。 next:包含…