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

P10806 [CEOI 2024] 洒水器

洛谷

看到这个题目,很明显可以二分答案。

考虑二分长度后怎么检验是否可行。

最简单的贪心思路就是直接从左到右枚举,如果左边有就向左边,否则向右边。

但是这样显然有错误,有时会存在左边的一个向左,右边的一个也向左,但是右边的也把左边所要覆盖的包含了,那么左边的如果向右就可能能够覆盖更多了。

显然局部最优解不一定属于全局最优解,但是考虑的内容并不多,考虑能否反悔。

这启示我们在向左时,要先看看之前选择了什么。

我们把合法状态设置为目前左边的全部覆盖且最右端是洒水器的情况。

我们希望合法状态覆盖的位置尽量向右。

如果最右边洒水器的都无法解决距离上一个洒水器中间的部分,那么显然不合法。

每加入一些需要浇水的地方和一个洒水器,那么我们结合前面洒水器的最右洒水距离,得出是否有还没浇到的。

如果没有,那么我们直接让现在的这个洒水器向右。

否则,就必须向左。

那么为了最向右,我们考虑上一个能不能改变方向去向右。

如果可以或者本来就是,那么我们就选择让这个向右。

那为什么不把上上个改成向右呢?

因为如果我们上个无法修改成向右,因为在不考虑上上个到上个之间的点时是保证有方案的,那么就说明当前的向左无法满足前一个要浇的点,那么就更不可能满足上上个。

并且我们修改了上一个,上上个就没有修改的必要了。

因此我们就可以选择判断是否修改上一个。

但是如果上一个修改了上上个怎么办?

那么就让上上个改回来,改回来以后能够保证有解,同时保证当前最大。

简单来说,上一个被改了,那么我们就让上上个之前保持原本的最佳状况即可。

至于维护,就直接打上标记,然后从后往前遍历,如果这个点有标记,那么把前一个位置标记去掉并修改。

这样最后就能得到最优方案了。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int read(){char c=getchar();int x=0;bool f=0;while(c>'9'||c<'0'){if(c=='-')f=1;c=getchar();}while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();if(f)return -x;return x;
}
int n,m,s[100005],f[100005],pre[100005];
bool ans[100005],mark[100005];
bool check(int x){memset(ans,0,sizeof(ans));memset(mark,0,sizeof(mark));int w=1;for(int i=1;i<=n;i++){if(w<=m&&f[w]<s[i]){if(f[w]<s[i]-x)return false;pre[i]=f[w];while(w<=m&&f[w]<=s[i])w++;if(i>1&&!ans[i-1]&&pre[i-1]>=s[i]-x){mark[i]=1;while(w<=m&&f[w]<=s[i-1]+x)w++;}}else {while(w<=m&&f[w]<=s[i]+x)w++;ans[i]=1;}}if(w<=m)return false;for(int i=n;i>=2;i--)if(mark[i])mark[i]=mark[i-1]=0,ans[i-1]=1;return true;
}
signed main(){n=read(),m=read();for(int i=1;i<=n;i++)s[i]=read();for(int i=1;i<=m;i++)f[i]=read();int l=0,r=1e9,res=-1;while(l<=r){int mid=l+r>>1;if(check(mid))r=mid-1,res=mid;else l=mid+1;}if(res==-1){cout<<-1;return 0;}check(res);cout<<res<<endl;for(int i=1;i<=n;i++){if(ans[i])putchar('R');else putchar('L');}return 0;
}
http://www.jsqmd.com/news/330822/

相关文章:

  • 提示工程架构师手记:设计多轮对话AI提示系统时的上下文衔接技巧
  • Tableau实战:5个大数据分析案例带你快速上手
  • System Operations Management 2
  • 开题报告 宠物医院网站的设计与实现
  • 数据分析不用 “死磕” 软件!虎贲等考 AI:让数据从 “沉睡” 到 “说话” 仅需 30 分钟
  • 开题报告 公共交通管理系统的设计与实现
  • 盲测 4 款问卷工具!虎贲等考 AI 颠覆认知:学术问卷从 “无效数据” 到 “审稿人认可” 仅需 1 步
  • DeepSeek 辅助科研项目申报:可行性报告与经费预算框架的智能化撰写指南
  • 开题报告 公交公司车辆管理系统
  • 开题报告 基于微信小程序的二手书交易平台的设计与实现
  • 查重报告优化:DeepSeek修改论文重复率并保持逻辑连贯
  • 开题报告 酒店管理系统设计与开发
  • 【实测】C盘清理软件,C盘清理神器,一键干净安全C盘垃圾清理,告别C盘变红卡顿!
  • 科研绘图告别 “无效内卷”!虎贲等考 AI:让数据可视化成为论文 “加分王牌”
  • 课程论文还在 “凑字赶 due”?虎贲等考 AI 让 3 天搞定 80+,告别低效内耗
  • Spring Boot :使用 Spring Cache 注解方式集成 Redis
  • 深入解析 π₀ 与 π₀.5:Physical Intelligence 的机器人基础模型演进
  • 【开题答辩全过程】以 基于协同过滤推荐算法的小说漫画网站设计与实现为例,包含答辩的问题和答案
  • PowerShell 实现类似 Bash 的补全行为
  • 寒假8
  • 天翼云电脑重装系统
  • 基于深度学习的跌倒检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
  • Godot Vertex
  • 【Termux】Ollama安装deepseek-r1:1.5b模型
  • 投稿核心期刊不再 “陪跑”!虎贲等考 AI:让期刊论文从 “初稿到录用” 高效通关
  • 基于微信小程序的美食点餐平台设计与实现
  • 学术 PPT 制作效率战!虎贲等考 AIPPT:10 分钟碾压 3 天手动排版
  • MySQL函数详解:日期、字符串、数学及其他常用函数
  • 电脑下载速度很慢是什么原因?有哪些方法可以提高电脑的下载速度?
  • Oracle 19c入门学习教程,从入门到精通,Java+Oracle实现企业人事管理系统(20)