[CodeForces - 1304] C - Air Conditioner【区间交集问题】

  •  题意:从0时刻开始,会按时间顺序来n个客人,每个客人有各自的满意温度区间。0时刻的初始温度为m. 每一时刻我们可以调节温度为 +1 或 -1. 问是否可以使得n个客人全部满意。

思路

设两个客人来访时间相差为mx,那么上一个状态可调节的温度区间就是[last.l - mx, last.r + mx],当前区间为[now.l, now.r],如果两个区间有交集,说明可以满足现在这个客人now。如果没有交集,说明不能。

END

#include <iostream>
#include <cstdio>
using namespace std;

inline int read()
{
    int x = 0, f = 1; char c = getchar();
    while(c < '0' || c > '9') { if(c == '-') f = -f; c = getchar(); }
    while(c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
    return x * f;
}

const int maxN = 105;
const char ans[2][5] = {"NO", "YES"};

int n, m;

struct node{
    int l, r, t;
    node() {}
    node(int a, int b, int c): l(a), r(b), t(c) {}
};

bool judge(node &n1, node n2)
{
    if(n1.r < n2.l || n1.l > n2.r) //无交集
        return false;
    if(n1.l < n2.l)
        n1.l = n2.l;
    if(n1.r > n2.r)
        n1.r = n2.r;
    return true;
}

int main()
{
    int TAT; TAT = read();
    while(TAT -- )
    {
        n = read(); m = read();
        node now = node(m, m, 0), info;
        bool flag = true;
        for(int i = 0; i < n; ++ i )
        {
            info.t = read();
            info.l = read(); info.r = read();
            int mx = info.t - now.t;
            now = node(now.l - mx, now.r + mx, info.t);
            if(judge(now, info)) continue;
            else flag = false;
        }
        printf("%s\n", ans[flag]);
    }
    return 0;
}

 

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页