Air Conditioner 题解
[Air Conditioner]
题意简述
题目链接。
给定一个整数 \(n\),每秒钟可以选择使 \(n\) 增加 \(1\) 或减少 \(1\) 或不改变,有 \(M\) 个询问,对于第 \(i\) 个询问,给定 \(t_i,l_i,r_i\),表示询问在第 \(t_i\) 秒时,是否有 \(n \in [l_i,r_i]\)。如果能满足所有的询问,输出 YES
,否则输出 NO
。时间从第 \(0\) 秒开始,有多组测试数据。
题目分析
设 \(L\) 表示当前 \(n\) 能达到的最小值,\(R\) 表示当前 \(n\) 能达到的最大值。
假设上一次询问的时间与这一次询问的时间差值为 \(p\),那么 \(L\leftarrow L-p,R \leftarrow R+p\)。
对于第 \(i\) 个询问我们求出 \(L,R\) 与 \(l_i,r_i\) 的交集,并将 \(L\) 赋值为交集的左端点,将 \(R\) 赋值为交集的右端点,即 \(L \leftarrow \max(L,l_i),R\leftarrow \min(R,r_i)\)。如果取完交集后发现 \(L>R\),即说明无法满足当前询问,输出 NO
并结束程序,否则继续考虑下一个询问。
Code
#include<bits/stdc++.h> using namespace std; int T,n,l,r; bool flag; struct node{ int l,r,t; }a[105]; bool cmp(node x,node y){ return x.t<y.t; } int main(){ cin>>T; while(T--){ flag=0; cin>>n>>l; r=l; for(int i=1;i<=n;i++){ cin>>a[i].t>>a[i].l>>a[i].r; } for(int i=1;i<=n;i++){ l=l-(a[i].t-a[i-1].t); r=r+(a[i].t-a[i-1].t); l=max(l,a[i].l); r=min(r,a[i].r); if(l>r){ puts("NO"); flag=1; break; } } if(!flag) puts("YES"); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现