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;
}
posted @ 2024-04-10 16:35  ZnHF  阅读(11)  评论(0编辑  收藏  举报