售票系统
题目描述
- 某次列车途经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 }