Qoj 14436. Robot Construction/Open Your Brain 做题记录

news/2025/10/11 16:10:50/文章来源:https://www.cnblogs.com/CodingGoat/p/19135293

前置芝士:线段树上二分。

题目大意

你可以制造一个初始高度 \(h\) 在区间 \([0, d]\) 内的机器人。

现在有一条长度为 \(n\) 的路径,上面放置了一些障碍物,用数组 \(a_1, a_2, \ldots, a_n\) 描述。

  • 如果 \(a_i = 0\),表示第 \(i\) 个位置没有障碍;
  • 如果 \(a_i > 0\),表示该处有一个高度为 \(a_i\) 的障碍。

当机器人从左到右通过一段区间 \([l, r]\) 时,会依次遇到该区间内的障碍。
对于每个障碍 \(a_i\),高度变化规则如下:

  • 若当前高度 \(h < a_i\),则机器人太矮,无法碰到障碍,高度不变;
  • 若当前高度 \(h \ge a_i\),则机器人碰到障碍,高度变为 \(h' = h - a_i\)

你需要回答 \(q\) 个询问。
每个询问给出一个区间 \([l_i, r_i]\)
要求出当初始高度 \(h \in [0, d]\) 时,
机器人通过区间 \([l_i, r_i]\) 后可能达到的最大最终高度。

思路

考虑对于一个高度为 \(a_i\) 的障碍,假设你当前可以有的高度区间为 \([0,h]\),那么我们有:

  • 对于 \(h<a_i\),答案不变;
  • 对于 \(a_i \le h <2a_i\),我们会发现 \([a_i,h]\) 的区间被往下减了 \(a_i\),所以说区间就相当于变成了 \([0,a_i-1]\)
  • 对于其他的情况,相当于变成了 \([0,h-a_i]\)

我们考虑把操作离线,进行扫描线,然后计算出每个东西的值,当当前位置为某个询问的左端点时,将 \(d\) 加入线段树,然后对线段树上值域在 \([a_i,2a_i-1]\) 的区间赋值为 \(a_i-1\),对于 \([2a_i,\inf)\) 区间减 \(a_i\)。这个东西我们可以线段树上二分,然后做一做就好了。

为什么可以线段树上二分?(即为什么在线段树上的值是单调的)

首先我们注意到每次操作不会使得答案增加,所以说后面加入的数一定是不会比前面的数要小的。

时间复杂度:\(O(q \log q)\)

点击查看代码

https://qoj.ac/submission/1488506

#include<bits/stdc++.h>#define int ll
#define pii pair<int,int> 
#define pll pair<long long,long long> 
#define ll long long
#define i128 __int128#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define in4(a,b,c,d) a=read(), b=read(), c=read(), d=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")using namespace std;int read() {int x=0,f=1; char c=getchar();for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }#define maxn 300050int n,q,d;
int a[maxn],ans[maxn];struct qur {int idx,l,r;
}qu[maxn];
bool cmp(qur a,qur b) {return a.l==b.l?a.r<b.r:a.l<b.l;
}struct SegT {struct Tp {int mn,mx,tag1,tag2;//区间覆盖 区间加}tr[maxn<<2];void psu(int idx) {tr[idx].mx=max(tr[lc(idx)].mx,tr[rc(idx)].mx);tr[idx].mn=min(tr[lc(idx)].mn,tr[rc(idx)].mn);}void stf1(int idx,int val) {tr[idx].mn=tr[idx].mx=tr[idx].tag1=val; tr[idx].tag2=0;}void stf2(int idx,int val) {tr[idx].mn+=val,tr[idx].mx+=val;if(tr[idx].tag1!=1e18) tr[idx].tag1+=val; else tr[idx].tag2+=val;}void psd(int idx,int l,int r) {if(tr[idx].tag1==1e18&&tr[idx].tag2==0) return ;if(tr[idx].tag1!=1e18) {stf1(lc(idx),tr[idx].tag1);stf1(rc(idx),tr[idx].tag1);	tr[idx].tag1=1e18;	 tr[idx].tag2=0;}if(tr[idx].tag2) {stf2(lc(idx),tr[idx].tag2);stf2(rc(idx),tr[idx].tag2);tr[idx].tag2=0;}}void build(int idx,int l,int r) {tr[idx].mn=tr[idx].tag1=1e18;tr[idx].mx=-1e18;if(l==r) return ;int mid=l+r>>1;build(lc(idx),l,mid);build(rc(idx),mid+1,r);}void add(int idx,int l,int r,int k,int val) {if(l==r) return tr[idx].mn=tr[idx].mx=val,tr[idx].tag1=1e18,tr[idx].tag2=0,void();int mid=l+r>>1;psd(idx,l,r);if(k<=mid) add(lc(idx),l,mid,k,val);else add(rc(idx),mid+1,r,k,val);psu(idx);}void modi(int idx,int l,int r,int vL,int vR,int val) {
//		cerr<<idx<<' '<<l<<' '<<r<<' '<<vL<<' '<<vR<<'\n';if(tr[idx].mx<vL) return; if(tr[idx].mn>vR) { stf2(idx,-val-1);return;}if(vL<=tr[idx].mn&&tr[idx].mx<=vR) { stf1(idx,val);return;}if(l==r) return;psd(idx,l,r);int mid=(l+r)>>1;modi(lc(idx),l,mid,vL,vR,val);modi(rc(idx),mid+1,r,vL,vR,val);psu(idx);}int query(int idx,int l,int r,int k) {if(l==r) return tr[idx].mx;int mid=l+r>>1; psd(idx,l,r);if(k<=mid) return query(lc(idx),l,mid,k);else return query(rc(idx),mid+1,r,k);}
}Tr;void work() {in3(n,q,d);For(i,1,n) in1(a[i]);For(i,1,q) in2(qu[i].l,qu[i].r),qu[i].idx=i;sort(qu+1,qu+q+1,cmp);vector<vector<int> > ad(n+10),calc(n+10);For(i,1,q) ad[qu[i].l].push_back(i),calc[qu[i].r].push_back(i);int cnt=0; Tr.build(1,1,q);For(i,1,n) {For(x,1,ad[i].size()) cnt++,Tr.add(1,1,q,cnt,d);
//		For(x,1,q) cout<<Tr.query(1,1,q,x)<<' '; puts("\n--");if(a[i]>0) Tr.modi(1,1,q,a[i],2*a[i]-1,a[i]-1);for(auto idx:calc[i]) {ans[qu[idx].idx]=Tr.query(1,1,q,idx);}
//		For(x,1,q) cout<<Tr.query(1,1,q,x)<<' '; puts("\n----------");}For(i,1,q) cout<<ans[i]<<'\n';
}signed main() {
//	freopen("data.in","r",stdin);
//	freopen("myans.out","w",stdout);
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);double stt=clock();int _=1;
//	_=read();
//	cin>>_;For(i,1,_) {work();}cerr<<"\nTotal Time is:"<<(clock()-stt)*1.0/1000<<" second(s)."<<'\n';return 0;
}
/*
5 3 5
0 2 6 1 3
5 5
1 5
1 3*/
/*
7 5 10
7 6 2 5 0 1 4
1 3
1 7
4 7
2 5
4 6
*/

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

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

相关文章

2025 年最新推荐!国内软件开发厂商排行榜:政企定制开发优选指南 物联网软件开发/运维管理系统软件开发/仓储管理系统软件开发/人力资源管理系统软件开发公司推荐

当前数字化转型浪潮下,政企机构对软件开发服务的需求呈爆发式增长,涵盖 CRM 系统、物联网平台、运维管理系统等多个领域。然而,市场上软件开发厂商资质良莠不齐,部分厂商技术架构落后,无法适配业务长期增长;部分…

函数计算 MSE Nacos : 轻松托管你的 MCP Server

随着 AI Agent 生态的发展,Model Context Protocol(MCP)作为连接 Agent 与外部工具的标准协议,正在被越来越多的技术团队采用。但在实际落地过程中,MCP Server 的部署、运维与统一管理成为关键挑战。作者:濯光 背…

Metasploit Framework 6.4.92 (macOS, Linux, Windows) - 开源渗透测试框架

Metasploit Framework 6.4.92 (macOS, Linux, Windows) - 开源渗透测试框架Metasploit Framework 6.4.92 (macOS, Linux, Windows) - 开源渗透测试框架 Rapid7 Penetration testing, updated Oct 10, 2025 请访问原文链…

如何查看Linux系统信息,Linux查看系统基本信息命令

Linux下如何查看版本信息?包括位数、版本信息以及CPU内核信息、CPU具体型号,今天飞飞将和你们分享Linux下如何查看版本信息?包括位数、版本信息以及CPU内核信息、CPU具体型号,今天飞飞将和你们分享1、uname -a …

基于MATLAB的梯度下降法实现

基于MATLAB的梯度下降法实现,包含精确线搜索和回溯线搜索两种策略,并针对二次函数优化进行优化:一、核心代码实现 1. 精确线搜索(黄金分割法) function t = exact_line_search(f, grad_f, x, d, a=0, b=1, tol=1e…

Python 处理 Word 文档中的批注(添加、删除) - E

在多人协作编辑 Word 文档时,批注可以帮助沟通修改意见、追踪讨论内容。无论是团队审阅报告,还是批改论文,批注都能让交流更直观。而如果你需要批量添加或删除批注,手动操作不仅耗时,还容易出错。本文将带你学习如…

Nexpose 8.23.0 for Linux Windows - 漏洞扫描

Nexpose 8.23.0 for Linux & Windows - 漏洞扫描Nexpose 8.23.0 for Linux & Windows - 漏洞扫描 Rapid7 on-prem Vulnerability Management, released Oct 6, 2025 请访问原文链接:https://sysin.org/blog/n…

2025 年房屋鉴定公司最新推荐权威榜单:涵盖安全评估 / 承载力 / 工程质量 / 危房 / 受损伤等领域,助您精准挑选靠谱机构

当前房地产行业持续发展,房屋安全成为民众关注焦点,房屋鉴定作为守护房屋安全的核心环节,行业地位愈发关键。但市场上房屋鉴定公司良莠不齐,部分机构资质缺失、技术团队薄弱、仪器设备落后,导致鉴定结果可信度低,…

当游戏NPC有了“灵魂”,网易伏羲解码游戏智能交互场景新实践

全球AI产业正经历深刻的技术范式转变,行业不仅关注基于通用模型的应用搭建,也愈发关注如何构建真正符合产业需求的模型能力体系,其中,“后训练”技术(Post-Training)至关重要。2025云栖大会《大模型后训练:打造…

2025最新微信公众号文章数据批量导出excel工具1.0版

之前的老粉应该都知道我已经开发过一款:微信公众号文章批量下载的软件了,可以将文章导出成word文档、pdf、markdown、html等格式, 而今天这款软件主要是批量导出文章数据为excel表格用的,用法上和之前的软件差不多…

磊科N60Pro刷机

磊科N60Pro刷机命令网线,一头连接千兆网口,一头电脑ssh 192.168.0.1useradmin密码:就是你设置的登录密码# 备份 BL2 引导分区(mtd1)dd if=/dev/mtd1 of=/tmp/mtd1_BL2.bin备份 u-boot-env 环境变量(mtd2)dd if=…

Mac端查词翻译工作流:基于欧路词典与Raycast

目录Mac端欧路词典配置Raycast整合欧路词典效果演示快速查词翻译OCR下载Easy Dictionary插件软件配置 Mac端欧路词典配置 默认读者已经有一定的词典配置经验,下面直接列出一些好用的资源: 词典pj:Mac端突破注册限制…

m3u8格式在直播场景中的应用

M3U8作为一种基于文本的播放列表格式,其核心作用在于将多个视频或音频片段组织成一个连续的播放序列,广泛应用于流媒体传输,尤其在实时直播领域扮演着关键角色。以下是M3U8在直播中的主要应用方式: 实现实时流媒体…

C# ProgressBar 进度条控件

原文链接:https://blog.csdn.net/qq_29406323/article/details/86291763 1 继承关系 Object→MarshalByRefObject→Component→Control→ProgressBarProgressBar表示Windows进度栏控件。 2 重要属性3 示例 3.1 制作简…

随手写的一个子进程

主进程 import ClearTouchGroundCacheCode from ../utils/workers/clearTouchGroundCache.worker.js; const blob = new Blob([ClearTouchGroundCacheCode], { type: application/javascript });this.clearTouchGrou…

来追梦-D1295 小F过河

前言 依旧是固定的前言。 拿下了第四名,和第三名同分结果提交次数多了。 发现第三名是我的同学并且比我弱之后大胆猜测他使用的奇怪的方法。 结果看了他T3的代码,的确如此,他居然转移的时候只转移前面和后面的 \(50…

P3605解题报告

前言 毕竟是解题报告,自然只是个报告了 最近再刷树状数组的题,但是线段树很多时候也能维护这个东西 当然,有些题目还可以使用主席树解决,看个人习惯了 题目意思 给出一颗带点权树,对于每一个节点求出他的子孙节点…

P13763 解题报告

前言 非常好的树上问题,使我的大脑旋转 不难,思维难度也不高,但是如果没有想到真的很难说 广告 同步发布于洛谷专栏,不确定有更好的阅读体验 题意 给出一颗树,不带边权点权,每次询问给出 \(s,t\) 问连接 \(s,t\)…

CF1082E 解题报告

题目意思 至多进行一次操作,一个操作定义为将 \(i\in{[l,r]}\) 的 \(a_i = a_i + b\) 这个 \(b\) 自定,无限制,询问至多一次操作之后,至多有多少个 \(i\in{[1,n]}\) 满足 \(a_i=c\) 其中 \(c\) 为给定的一个数。 思…