线段树

                                                                                                     售票系统

题目描述

  • 某次列车途经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\n");
59            Modify(1,1,c-1,l,r,w);
60        }
61        else {
62           printf("NO\n");
63        }
64     }
65 
66     return 0;
67 }
View Code

 

 
posted @ 2020-07-09 17:37  ddoodd  阅读(165)  评论(0编辑  收藏  举报