cf #620 div2 C. Air Conditioner

打cf以来第一次 赛中写出c题。。。
我还是太菜了。。acm路漫漫
先上题面
cf #620 div2 C. Air Conditioner_第1张图片
我先讲一下题目意思 大概就是: 给出n个客人来的时间和每个人所能忍受的最高与最低的温度 每分钟你可以使温度+1或-1 给出n个客人的信息(忍受边界和来的时间) 以及饭馆初始温度 初始时间为0 询问是否存在一种方案使客人全部都能满意
这题的坑点是客人们可能会同时到来 注意下就好
我的思路是 按照时间层层递进 求出从初始到每个时间在顺应客人的情况下所能产生的最高温和最低温 如果所有的客人需要的温度均能产生 则可以
比如说
定义一个time 为当前时间 l 为当前能供应的最低温 r为最高温
初始 l=r=m;
对于每个时间点的客人 找出这一批客人中 最大的最低温和最小的最高温 即取一个刚好所有人都能忍受的区间 取不到就直接break输出no
取得到 比如
当前客人区间为 low到high 当前时间为t
上一个温度区间为l到r 时间为time 则上一个能产生的温度的范围是
l-(t-time)到 r+(t-time); 看这两个区间并集是否为空 为空则不行 break输出
不为空 则修改区间 dis =t-time l=max( l-dis,low) r=min(high,r+dis)

我wa了一次 原因是初始温度边界开小了 我用的是-1 和 1e15 .。。。改成了题目中第一个客人边界就a了。。还是不够严谨 害
上代码吧

#include
#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
struct nd
{
    ll t,l,r;
}arr[105];
void solve()
{
    ll n,m;
    cin>>n>>m;
    for(ll i=1;i<=n;i++)
        cin>>arr[i].t>>arr[i].l>>arr[i].r;
    bool flag=true;
    
    ll low=m,high=m,time=0,now=0;
    for(int i=1;i<=n;i++)
    {
       
        ll st=arr[i].l,ed=arr[i].r;
        time=arr[i].t;
        for(int j=i;j<=n;j++)
        {
            i=j;
            if(arr[j].t!=time)
            {
                i=j-1;
                break;
            }
            st=max(st,arr[j].l);
            ed=min(ed,arr[j].r);
        }
        if(st>ed)
        {
            flag=false;
            break;
        }
        ll dis=time-now;
        now=time;
        if(st>high+dis||ed>t;
    while(t--)
    {
        solve();
    }
    return 0;
}

你可能感兴趣的:(codeforce)