Codeforces Round #620 (Div. 2) C. Air Conditioner
Gildong owns a bulgogi restaurant. The restaurant has a lot of customers, so many of them like to make a reservation before visiting it.
Gildong tries so hard to satisfy the customers that he even memorized all customers' preferred temperature ranges! Looking through the reservation list, he wants to satisfy all customers by controlling the temperature of the restaurant.
The restaurant has an air conditioner that has 3 states: off, heating, and cooling. When it's off, the restaurant's temperature remains the same. When it's heating, the temperature increases by 1 in one minute. Lastly, when it's cooling, the temperature decreases by 1 in one minute. Gildong can change the state as many times as he wants, at any integer minutes. The air conditioner is off initially.
Each customer is characterized by three values: titi — the time (in minutes) when the ii -th customer visits the restaurant, lili — the lower bound of their preferred temperature range, and hihi — the upper bound of their preferred temperature range.
A customer is satisfied if the temperature is within the preferred range at the instant they visit the restaurant. Formally, the ii -th customer is satisfied if and only if the temperature is between lili and hihi (inclusive) in the titi -th minute.
Given the initial temperature, the list of reserved customers' visit times and their preferred temperature ranges, you're going to help him find if it's possible to satisfy all customers.
Input
Each test contains one or more test cases. The first line contains the number of test cases qq (1≤q≤5001≤q≤500 ). Description of the test cases follows.
The first line of each test case contains two integers nn and mm (1≤n≤1001≤n≤100 , −109≤m≤109−109≤m≤109 ), where nn is the number of reserved customers and mm is the initial temperature of the restaurant.
Next, nn lines follow. The ii -th line of them contains three integers titi , lili , and hihi (1≤ti≤1091≤ti≤109 , −109≤li≤hi≤109−109≤li≤hi≤109 ), where titi is the time when the ii -th customer visits, lili is the lower bound of their preferred temperature range, and hihi is the upper bound of their preferred temperature range. The preferred temperature ranges are inclusive.
The customers are given in non-decreasing order of their visit time, and the current time is 00 .
Output
For each test case, print "YES" if it is possible to satisfy all customers. Otherwise, print "NO".
You can print each letter in any case (upper or lower).
Example
4 3 0 5 1 2 7 3 5 10 -1 0 2 12 5 7 10 10 16 20 3 -100 100 0 0 100 -50 50 200 100 100 1 100 99 -100 0
YES NO YES NO
大意就是一个餐馆有一台可以调温的空调,在某一时刻可以选择升温一度,不变或者降温一度,餐馆有一个初始温度m,同时有m个顾客,每个顾客i是满意的当且仅当ti时刻的温度在他的接受范围之内(由输入给出),问这个餐馆能否通过某种调温方式让每个顾客否满意。
可以这么想,先对顾客按进入时间排序,建立两个变量up和down存储当前可调至的最高温和最低温,初始时刻up=down=m。从上一时刻到当前时刻,先更新up为 up + ( ti - t i-1 ),更新down为 down - ( ti - t i-1 ),这说明更新后从上一时刻到这一时刻,餐馆可以将温度调到[down,up]区间的任何一个温度,然后判断当前时刻顾客的舒适温度区与[down,up]是否有交集,没有的话直接break,输出NO,如果能让所有人都满意的话输出YES。
比赛时匆忙写的代码比较丑,参考下意思就行。
#include <bits/stdc++.h> using namespace std; int n,m; struct peo { int t; int l; int h; }p[105]; bool cmp(peo a,peo b) { return a.t<b.t; } int main() { int t; cin>>t; while(t--) { cin>>n>>m; int i,j; for(i=1;i<=n;i++) { int x1,x2,x3; scanf("%d%d%d",&x1,&x2,&x3); p[i].t=x1; p[i].l=x2; p[i].h=x3; } sort(p+1,p+n+1,cmp); bool flag=1; int up=m; int down=m; p[0].t=0; for(i=1;i<=n;i++) { up+=(p[i].t-p[i-1].t); down-=(p[i].t-p[i-1].t); if(p[i].l>up||p[i].h<down) { flag=0; break; } if(up<=p[i].h&&up>=p[i].l&&down<=p[i].l) { up=up; down=p[i].l; } else if(up>=p[i].h&&down<=p[i].h&&down>=p[i].l) { up=p[i].h; down=down; } else if(up>p[i].h&&down<p[i].l) { up=p[i].h; down=p[i].l; } else if(up<p[i].h&&down>p[i].l) { } cout<<up<<' '<<down<<endl; } if(flag==0) { cout<<"NO"<<endl; } else { cout<<"YES"<<endl; } } return 0; }