题目内容
初始空调温度为 m m m ,按照时间非降序依次进来 n n n 个客人,第 i i i 个客人在到店那一时刻 t i t_i ti 的满意温度为 [ l o w i , h i g h i ] [low_i,high_i] [lowi,highi] ,每分钟可以将空调温度升高 1 1 1 或减少 1 1 1 或不变,问是否可以让这 n n n 个客人在到店时刻的温度都满意。
数据范围
- 2 ≤ n ≤ 100 2\leq n\leq 100 2≤n≤100
- − 1 0 9 ≤ m , l o w i , h i g h i ≤ 1 0 9 -10^9\leq m,low_i,high_i\leq 10^9 −109≤m,lowi,highi≤109
- 1 ≤ t i ≤ 1 0 9 1\leq t_i\leq 10^9 1≤ti≤109
题解
考虑我们达到时间 t i t_i ti 的时候,可以达到的 [ l o w i , h i g h i ] [low_i,high_i] [lowi,highi] 的哪部分区间,一定是一段连续的区间。
然后从 t i t_i ti 到 t i + 1 t_{i+1} ti+1 最多可以将温度升高或减少 t i + 1 − t i t_{i+1}-t_i ti+1−ti,即 [ − ( t i + 1 − t i ) , t i + 1 − t i ] [-(t_{i+1}-t_i),t_{i+1}-t_i] [−(ti+1−ti),ti+1−ti] 。
看每个人的合适温度区间在其到店时刻是否可以达到,如果存在一个不能达到,则为 NO
。
这里需要注意一点,可能存在多个人在同一时刻到店,我们需要将温度调整成所有人的满意温度,可以预处理出所有同一时刻到店的人的满意温度区间交集。
时间复杂度: O ( n ) O(n) O(n)
代码
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n, m;
cin >> n >> m;
vector<array<int, 3>> vec(n);
for (int i = 0; i < n; ++i) {
cin >> vec[i][0] >> vec[i][1] >> vec[i][2];
}
int g = 0;
for (int i = 0; i < n; ++i) {
int l = vec[i][1], r = vec[i][2];
int j = i + 1;
while (j < n && vec[j][0] == vec[i][0]) {
l = max(l, vec[j][1]);
r = min(r, vec[j][2]);
j += 1;
}
if (l > r) {
cout << "NO\n";
return;
}
vec[g++] = {vec[i][0], l, r};
i = j - 1;
}
n = g;
int l = m, r = m;
int t = 0;
for (int i = 0; i < n; ++i) {
// 前一个状态可以在 [l, r]
int cht = vec[i][0] - t;
int next_r = min(vec[i][2], r + cht);
int next_l = max(vec[i][1], l - cht);
if (next_l > next_r) {
cout << "NO\n";
return;
}
l = next_l;
r = next_r;
t = vec[i][0];
}
cout << "YES\n";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T = 1;
cin >> T;
while (T--) {
solve();
}
return 0;
}