售票系统

  • Description

某次列车途经C个城市,城市编号依次为1到C,列车上共有S个座位,铁路局规定售出的车票只能是坐票,即车上所有的旅客都有座,售票系统是由计算机执行的,每一个售票申请包含三个参数,分别用O、D、N表示,O为起始站,D为目的地站,N为车票张数,售票系统对该售票申请作出受理或不受理的决定,只有在从O到D的区段内列车上都有N个或N个以上的空座位时该售票申请才被受理,请你写一个程序,实现这个自动售票系统。

  • Input

输入第一行包含三个用空格隔开的整数C、S和R,C为城市个数,S为列车上的座位数,R为所有售票申请总数。接下来的R行每行为一个售票申请,用三个由空格隔开的整数O,D和N表示,O为起始站,D为目的地站,N为车票站数,其中D<=C,1<=N<=C,所有的售票申请按申请的时间从早到晚给出。

  • Output

输出共有R行,每行输出一个“YES”或“NO”,表示当前的售票申请被受理或不被受理。

  • Sample Input

4 6 4
1 4 2
1 3 2
2 4 3
1 2 3

  • Sample Output

YES
YES
NO
NO

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
#define max(x,y) ((x)>(y)?(x):(y))
#define MAXN 60010
int C,S,R;
struct node
{
    int l,r,mx,change;
}arr[4*MAXN];

void Build(int l,int r,int id)
{
    arr[id].l=l,arr[id].r=r,arr[id].mx=0,arr[id].change=0;
    if(l==r)
        return ;
    int mid=(l+r)/2;
    Build(l,mid,2*id);
    Build(mid+1,r,2*id+1);
}

void init(int id,int x)
{
    arr[id].mx+=x;
}

int search(int l,int r,int id,int require)
{
    if(l==arr[id].l && arr[id].r==r)
        return arr[id].mx+require<=S;
    if(arr[id].change)
    {
        init(2*id,arr[id].change),init(2*id+1,arr[id].change);
        arr[2*id].change+=arr[id].change;
        arr[2*id+1].change+=arr[id].change;
        arr[id].change=0;
    }
    int mid=(arr[id].l+arr[id].r)/2;
    if(r<=mid)
        return search(l,r,2*id,require);
    else
        if(l>mid)
            return search(l,r,2*id+1,require);
        else
            if(l<=mid && r>mid)
                return (search(l,mid,2*id,require) && search(mid+1,r,2*id+1,require));
}

void update(int l,int r,int dt,int id)
{
    if(l<=arr[id].l && arr[id].r<=r)
    {
        arr[id].change+=dt;
        arr[id].mx+=dt;
        return ;
    }
    if(arr[id].change)
    {
        init(2*id,arr[id].change),init(2*id+1,arr[id].change);
        arr[2*id].change+=arr[id].change;
        arr[2*id+1].change+=arr[id].change;
        arr[id].change=0;
    }
    int mid=(arr[id].l+arr[id].r)/2;
    if(l<=mid)
        update(l,r,dt,2*id);
    if(r>mid)
        update(l,r,dt,2*id+1);
    arr[id].mx=max(arr[2*id].mx,arr[2*id+1].mx);
}

int main()
{
   //freopen("in.txt","r",stdin);
    int ll,rr,c,i;
    scanf("%d %d %d",&C,&S,&R);
    Build(1,C-1,1);
    for(i=1;i<=R;i++)
    {
        scanf("%d %d %d",&ll,&rr,&c);
        rr--;
        if(search(ll,rr,1,c))
        {
            printf("YES\n");
            update(ll,rr,c,1);
        }
        else
            printf("NO\n");
    }
    return 0;
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值