zoukankan      html  css  js  c++  java
  • 线段树

                                                                                                         售票系统

    题目描述

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

    输入格式

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

    输出格式

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

    样例

    样例输入

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

    样例输出

    YES
    YES
    NO
    NO 
    
     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 const int maxn=60000+10;
     5 int tree[maxn<<2],lazy[maxn<<2];
     6 void Build(int rt,int l,int r){
     7      if(l==r){
     8         tree[rt]=0;
     9         return ;
    10      }
    11      int mid=(l+r)>>1;
    12      Build(rt<<1,l,mid);
    13      Build(rt<<1|1,mid+1,r);
    14      tree[rt]=max(tree[rt<<1],tree[rt<<1|1]);
    15 }
    16 void update(int rt,int l,int r,int w){
    17      tree[rt]+=w;
    18      lazy[rt]+=w;
    19 }
    20 void pushdown(int rt,int l,int r){
    21      int mid=(l+r)>>1;
    22      update(rt<<1,l,mid,lazy[rt]);
    23      update(rt<<1|1,mid+1,r,lazy[rt]);
    24      lazy[rt]=0;
    25 }
    26 void Modify(int rt,int l,int r,int s,int t,int w){
    27      if(s<=l&&t>=r){
    28         update(rt,l,r,w);
    29         return ;
    30      }
    31     // pushdown(rt,l,r);
    32      int mid=(l+r)>>1;
    33      if(s<=mid) Modify(rt<<1,l,mid,s,t,w);
    34      if(t>mid) Modify(rt<<1|1,mid+1,r,s,t,w);
    35      tree[rt]=max(tree[rt<<1],tree[rt<<1|1]);
    36 }
    37 int query(int rt,int l,int r,int s,int t){
    38     if(s<=l&&t>=r){
    39     //    update(rt,l,r);
    40         return tree[rt];
    41     }
    42     int mid=(r+l)>>1;
    43     pushdown(rt,l,r);
    44     if(t<=mid) return query(rt<<1,l,mid,s,t);
    45     else if(s>mid) return query(rt<<1|1,mid+1,r,s,t);
    46     else return max(query(rt<<1,l,mid,s,t),query(rt<<1|1,mid+1,r,s,t));
    47 }
    48 int main(){
    49     int c,s,R;
    50     scanf("%d%d%d",&c,&s,&R);
    51     //Build(1,1,c-1);
    52     for(int i=1;i<=R;i++){
    53        int l,r,w;
    54        scanf("%d%d%d",&l,&r,&w);
    55        r--;
    56        int sum=query(1,1,c-1,l,r);
    57        if(sum+w<=s){
    58            printf("YES
    ");
    59            Modify(1,1,c-1,l,r,w);
    60        }
    61        else {
    62           printf("NO
    ");
    63        }
    64     }
    65 
    66     return 0;
    67 }
    View Code
     
  • 相关阅读:
    经典算法之猴子吃桃
    VS2008C#Sqlserver2008数据库的连接以及增删改查
    在数组中随机插入数字且不重复
    菲波那切数列
    Js之AJAX
    经典算法之冒泡排序
    《Head First 设计模式》 第一章 设计模式入门
    Redis 的 IO 多路复用,学习研究
    高性能MySQL 第十章 复制 Part2
    高性能MySQL 第十一章 可扩展的MySQL
  • 原文地址:https://www.cnblogs.com/HZOIDJ123/p/13275002.html
Copyright © 2011-2022 走看看