题目:
题意解析:
-
一个餐馆中有个空调,每分钟可以选择上调 1 个单位的温度或下调 1 个单位的温度,当然你也可以选择不变,初始的温度为 m 。
-
有 n 个食客,每个食客会在 ti 时间点到达,他所能适应的最低温度是 li ,最高温度是 hi ,他只会在 ti 时刻逗留。
-
如果温度不在食客的适应范围内,他就会不舒服,请你判断,空调能否使得 n 位来就餐的食客都感到舒服。
-
本题多组数据,数据组数不大于 500500。
-
1≤n≤100,−10^9≤m,li,hi≤10^9,1≤ti≤109。
题意解析:
(1)因为输入的时间是从小到大输入,所以不用排序处理。用 t 记录上次的时间,left记录上次最小的值,right记录的是上次最大的值。
(2)缩小范围是用上次的值,先使用 left-(a-t),right+(a-t)。(a-t是时间差值。)求出本次时间范围的最大值。然后判断输入的值在不在时间范围中,最后判断要不要缩短时间范围。
(3)判断输入的值在不在时间范围中,只有的两种情况,就是输入的最大值比left小,或者是输入的最小值比right大。
(4)缩短时间范围,也有两种情况,一种是b比left大,left=b,一种是right比c小,right=c。这两种是分开考虑的。你可以在纸上画图处理,最后得到这两种是最简单的处理方法。
代码:
#include<bits/stdc++.h>
using namespace std;
int q,n;
long long int m;
int main() {
cin>>q;
while(q--) {
cin>>n>>m;
long long int left,right,t;
int sign=0;
left=right=m;
t=0;
for(int i=0; i<n; i++) {
long long int a,b,c;
cin>>a>>b>>c;
if(sign==0) {
left=left-(a-t);
right=right+(a-t);
// 判断一下是不是在范围内
if(b>right||c<left) {
sign=1;
continue;
}
if(left<b){
left=b;
}
if(right>c){
right=c;
}
t=a;
}
}
if(sign==0) {
cout<<"YES"<<endl;
} else {
cout<<"NO"<<endl;
}
}
return 0;
}