【cogs247】售票系统

【问题描述】


某次列车途经C个城市,城市编号依次为1到C,列车上共有S个座位,铁路局规定售出的车票只能是坐票,
即车上所有的旅客都有座。售票系统是由计算机执行的,每一个售票申请包含三个参数,分别用O、D、N表示,O为起始站,D为目的地站,N为车票张数。售票
系统对该售票申请作出受理或不受理的决定,只有在从O到D的区段内列车上都有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≤D≤C,1≤O≤C,所有的售票申请按申请的时间从早到晚给出。

【输出格式】

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

【分析】

线段树的应用,记录区间最大值,标记下传。

 1 #include <cstdlib>
2 #include <iostream>
3 #include <cstdio>
4 #include <cmath>
5 #include <cstring>
6 #include <queue>
7 #include <vector>
8 #define NEW(p) p=&mem[++size_point];p->from=0;p->to=0;p->cnt=p->lazy=0;p->left=NULL;p->right=NULL
9 const int maxn=60000*2+100;
10 using namespace std;
11 struct node
12 {
13 int from,to,cnt,lazy;
14 node *left,*right;
15 }*root,mem[maxn];
16 int c,s,r,size_point=0;
17
18 void make_tree(node *&t,int from,int to);
19 int count(node *&t,int from,int to);
20 void add(node *&t,int from,int to,int n);
21 void print(node *&t);
22
23 int main()
24 {
25 int i;
26
27 scanf("%d%d%d",&c,&s,&r);
28 make_tree(root,1,c);
29 for (i=1;i<=r;i++)
30 {
31 int u,v,n;
32 scanf("%d%d%d",&u,&v,&n);
33 v--;//注意是闭区间
34 if (count(root,u,v)+n<=s) {printf("YES\n");add(root,u,v,n);}
35 else printf("NO\n");
36 }
37 return 0;
38 }
39 void make_tree(node *&t,int from,int to)
40 {
41 NEW(t);
42 if (from>to) return;
43 if (from==to) {t->from=from;t->to=to;return;}
44 t->from=from;t->to=to;
45 make_tree(t->left,from,(from+to)/2);
46 make_tree(t->right,((from+to)/2)+1,to);
47 }
48 void add(node *&t,int from,int to,int n)
49 {
50 if (from==t->from && to==t->to)
51 {
52 t->cnt+=n;
53 t->lazy+=n;
54 return;
55 }
56 if (t->lazy!=0)
57 {
58 t->left->cnt+=t->lazy;t->right->cnt+=t->lazy;
59 t->left->lazy+=t->lazy;t->right->lazy+=t->lazy;
60 t->lazy=0;
61 }
62 int mid=(t->from+t->to)/2;
63 if (to<=mid) add(t->left,from,to,n);
64 else if (mid<from) add(t->right,from,to,n);
65 else //分段
66 {
67 add(t->left,from,mid,n);
68 add(t->right,mid+1,to,n);
69 }
70 t->cnt=max(t->left->cnt,t->right->cnt);
71 }
72 int count(node *&t,int from,int to)
73 {
74 if (from==t->from && to==t->to)
75 return t->cnt;
76 if (t->lazy!=0)
77 {
78 t->left->cnt+=t->lazy;t->right->cnt+=t->lazy;
79 t->left->lazy+=t->lazy;t->right->lazy+=t->lazy;
80 t->lazy=0;
81 }
82 int mid=(t->from+t->to)/2;
83 if (to<=mid) return count(t->left,from,to);
84 else if (mid<from) return count(t->right,from,to);
85 else //分段
86 {
87 return
88 max(count(t->left,from,mid),
89 count(t->right,mid+1,to));
90 }
91 }
92 void print(node *&t)//调试用
93 {
94 if (t==NULL) return;
95 printf("%d %d %d\n",t->from,t->to,t->cnt);
96 print(t->left);
97 print(t->right);
98 }

【cogs247】售票系统

时间: 2024-10-10 18:29:51

【cogs247】售票系统的相关文章

【cogs247】售票系统【线段树】

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

c#简单写售票系统

代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 售票系统 { class Program { static void Main(string[] args) { Console.Title = "售票系统"; string[,] zuo = new string[9, 4]; for (int i = 0; i < 9; i++)

使用Java多线程模简单拟售票系统

创建单个"火车票类" package date0804.demo3; /** * 票 * @author zzw922cn * */ public final class Ticket { private final String name; public Ticket(String name) { super(); this.name = name; } public String getName() { return name; } } 火车票DB的构建 采用静态工厂生产火车票的模

p1245 售票系统(线段树)

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

多线程售票系统的感想

package 异常练习;class Seel implements Runnable{ private String name; private int ticket=100; Seel(String name){  this.name=name; } public void run(){  while(true){   if(ticket>0){    System.out.println(Thread.currentThread().getName()+"正在售票"+&qu

C#总结项目《影院售票系统》编写总结一

C#学习经历从基本语法结构到窗体再到面向对象终于走完了.NET初级程序员的道路,做为品德优良好学生更不能落下课程的总结项目-某某鸟<影院售票系统>.用了大概一天半的时间做完这个练手项目,先上效果截图一张 抽出时间做些这个对目前的我来说算不小的项目. 用到的知识点有:面向对象思想.TreeView.XML读取.File文件流.泛型集合,这里面对我来说难度最大的是面向对象与泛型集合的结合,看来学习一门编程语言的难点还是在设计思想上. 再来介绍一下项目需求:在影片列表中选择某个时段的一场电影,单击座

影院售票系统-----一个让你有成就感的小项目,只有一丢丢哦

先来点废话,刚拿到这个项目的时候你是怎么想的,上来就闷头写,还是构想思路......   项目需求:     影院售票系统可以销售每天不同时段的电影票,不同时段的电影票有不同的优惠政策,还有使用兑换券的免费票.选择某个时段的一场电影,     单击放映厅未售出的座位并选择一个种类的电影票,创建电影票,计算价格并打印,座位设置为红色表示已经售出.   思想:    使用面向对象思想编写影院售票系统   看完这个你有没有点思路呢,我想你是有的 ...... 下面先来点图片,先刺激一下视觉:  窗体搭

售票系统

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

【题解】售票系统--一道毒瘤题

售票系统 输入文件:railway.in 输出文件:railway.out 时间限制:1 s 内存限制:128 MB [问题描述] 某次列车途经C个城市,城市编号依次为1到C,列车上共有S个座位,铁路局规定售出的车票只能是坐票, 即车上所有的旅客都有座.售票系统是由计算机执行的,每一个售票申请包含三个参数,分别用O.D.N表示,O为起始站,D为目的地站,N为车票张数.售票 系统对该售票申请作出受理或不受理的决定,只有在从O到D的区段内(作者注:这句话是大毒瘤啊!!!)列车上都有N个或N个以上的空