售票系统

  • 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;
} 
使用说明 1 电脑上装JDK 2 电脑上装oracle数据库,创建train数据库。 3 在dos下打开train数据库后,把oracle.txt创建表和序列里的代码(包括insert代码)复制到dos下运行,记得最后再按一下回车键,让最后一行也运行。 4 在eclipse或myeclipse下新建java项目(注意不是jsp项目)后,复制src文件夹到替换项目里的src。然后在复制train.pro,右击项目名粘贴(即把train.pro 加到项目 目录里) 5 把classes12.jar 添加到项目里。右键项目,点击Build Path 后再点击add External Archives 后找到classes12.jar文件打开即可。 6 在eclipse里打开wed包下OracleDB.java 设置oracle 连接byby用户的密码,String password="baby"; 我的密码是baby,这里改成你自己的密码。 7 运行client包下的Administrator.java ,若没有错如则OK。 8 运行后点击工具条里的‘工具’,后再点击‘生成所有列车表’,若成功,此时可看见列车表里增加了很多数据。可能有点慢,稍等一会。 9 若8 成功,则点击工具条里的‘工具’,后再点击‘生成所有车票表’,若成功,此时可看见车票表里增加了很多数据。可能有点慢,稍等一会。 关于工具条理的‘生成所有列车表’ ‘生成所有车票表’ "生成列车表" "生成车票表" "设置天数" 的介绍 1 ‘生成所有列车表’ 是根据车次表和车站表的全部数据自动生成 列车表 里的数据, 仅限于第一次时使用。 2 ‘生成所有车票表’ 是根据 列车表 里的全部数据自动生成 车票表 里的数据, 仅限于第一次时使用。 3 "生成列车表" 是根据你输入的某一列车次(必须是车次表里的车次和车站表里有与之相关的数据时才能使用)自动生成 列车表 里的数据 4 "生成车票表" 是根据你输入的某一ID(必须是列车表里的ID)自动生成 车票表 里的数据 5 "设置天数" 是设置能够预订和销售的最多天数,默认是3 天,即能预订和销售3天内的车票 注意: 1 订票记录表,销售记录表,退票记录表里的时间是系统自动生成,在任何情况下都不需填写 也不能修改 2 在管理员模块里添加,删除和修改后需更新一下才能显示,只需点一下别的表,在点刚修改的表即可,数据完全正确 3 退票员和销售员登录时分别查询对应表的记录,因此需要在管理员模块里增加相应记录后才能登录 4 此系统暂时已知还有多个缺陷,如如退票是可一张票可退多次,一个订票id可买多张车票。由于时间因素,就不在修补了。 5 train.pro 是个配置文件,可用记事本打开,尽量在train下的Main_Config.java里修改其配置信息
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值