【问题描述】

某次列车途经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”,表示当前的售票申请被受理或不被受理。

【分析】

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

 #include <cstdlib>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#define NEW(p) p=&mem[++size_point];p->from=0;p->to=0;p->cnt=p->lazy=0;p->left=NULL;p->right=NULL
const int maxn=*+;
using namespace std;
struct node
{
int from,to,cnt,lazy;
node *left,*right;
}*root,mem[maxn];
int c,s,r,size_point=; void make_tree(node *&t,int from,int to);
int count(node *&t,int from,int to);
void add(node *&t,int from,int to,int n);
void print(node *&t); int main()
{
int i; scanf("%d%d%d",&c,&s,&r);
make_tree(root,,c);
for (i=;i<=r;i++)
{
int u,v,n;
scanf("%d%d%d",&u,&v,&n);
v--;//注意是闭区间
if (count(root,u,v)+n<=s) {printf("YES\n");add(root,u,v,n);}
else printf("NO\n");
}
return ;
}
void make_tree(node *&t,int from,int to)
{
NEW(t);
if (from>to) return;
if (from==to) {t->from=from;t->to=to;return;}
t->from=from;t->to=to;
make_tree(t->left,from,(from+to)/);
make_tree(t->right,((from+to)/)+,to);
}
void add(node *&t,int from,int to,int n)
{
if (from==t->from && to==t->to)
{
t->cnt+=n;
t->lazy+=n;
return;
}
if (t->lazy!=)
{
t->left->cnt+=t->lazy;t->right->cnt+=t->lazy;
t->left->lazy+=t->lazy;t->right->lazy+=t->lazy;
t->lazy=;
}
int mid=(t->from+t->to)/;
if (to<=mid) add(t->left,from,to,n);
else if (mid<from) add(t->right,from,to,n);
else //分段
{
add(t->left,from,mid,n);
add(t->right,mid+,to,n);
}
t->cnt=max(t->left->cnt,t->right->cnt);
}
int count(node *&t,int from,int to)
{
if (from==t->from && to==t->to)
return t->cnt;
if (t->lazy!=)
{
t->left->cnt+=t->lazy;t->right->cnt+=t->lazy;
t->left->lazy+=t->lazy;t->right->lazy+=t->lazy;
t->lazy=;
}
int mid=(t->from+t->to)/;
if (to<=mid) return count(t->left,from,to);
else if (mid<from) return count(t->right,from,to);
else //分段
{
return
max(count(t->left,from,mid),
count(t->right,mid+,to));
}
}
void print(node *&t)//调试用
{
if (t==NULL) return;
printf("%d %d %d\n",t->from,t->to,t->cnt);
print(t->left);
print(t->right);
}

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

  1. COGS247. 售票系统[线段树 RMQ]

    247. 售票系统 ★★☆   输入文件:railway.in   输出文件:railway.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 某次列车途经C个城市,城市 ...

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

    售票系统 输入文件:railway.in 输出文件:railway.out 时间限制:1 s 内存限制:128 MB [问题描述] 某次列车途经C个城市,城市编号依次为1到C,列车上共有S个座位,铁路 ...

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

    C#学习经历从基本语法结构到窗体再到面向对象终于走完了.NET初级程序员的道路,做为品德优良好学生更不能落下课程的总结项目-某某鸟<影院售票系统>.用了大概一天半的时间做完这个练手项目,先 ...

  4. C#编写影院售票系统(A project with a higher amount of gold )

    项目需求: 影院售票系统 1.基础设施 放映厅 座位集合 2.一个海报------------>放映计划 3.售票设置----------->观影 领域模型:程序中提炼出的实体 4.从电影 ...

  5. C#编写影院售票系统(A project with a higher amount of gold )(2:相关代码)

    此篇文章为项目代码,,,需要项目需求 ,思路分析与窗体效果请访问:http://www.cnblogs.com/lsy131479/p/8367304.html 项目类图: 影院类: using Sy ...

  6. c#简单写售票系统

    原理: 先生成一个9行4列的数组,然后用一个输入的值(坐标)去替换掉座位 代码: using System; using System.Collections.Generic; using Syste ...

  7. cogs 247. 售票系统 线段树

    247. 售票系统 ★★☆   输入文件:railway.in   输出文件:railway.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 某次列车途经C个城市,城市 ...

  8. 干货 | C#开发的电影售票系统

    01 介绍 一个有会员制的电影院购票系统.具有会员注册功能,可区分会员和散客两种身份,实现会员及折扣管理.购票具有挑选电影场次,选择座位和查看电影信息等功能. 查看电影详情.获取排片信息. 选择场次座 ...

  9. 轻松应对并发问题,简易的火车票售票系统,Newbe.Claptrap 框架用例,第一步 —— 业务分析

    Newbe.Claptrap 框架非常适合于解决具有并发问题的业务系统.火车票售票系统,就是一个非常典型的场景用例. 本系列我们将逐步从业务.代码.测试和部署多方面来介绍,如何使用 Newbe.Cla ...

随机推荐

  1. Java实现二叉树的构建与遍历

    转载:http://ocaicai.iteye.com/blog/1047397 目录: 1.把一个数组的值赋值给一颗二叉树 2.具体代码 1.树的构建方法 2.具体代码 package tree; ...

  2. oracle触发器与:new,:old的使用 --5

    :new --为一个引用最新的列值;:old --为一个引用以前的列值; 这两个变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而inse ...

  3. -_-#【Mac】MacVim

    MacVim安装与配置 Mac开发利器之程序员编辑器MacVim学习总结 Git时代的VIM不完全使用教程 zencoding-vim This repository has moved to htt ...

  4. Qt入门(13)——Qt的调用退出

    如果我们创建了一个窗口,接下来使这个应用程序在用户让它退出的时候退出. #include <qfont.h>因为这个程序使用了QFont,所以它需要包含qfont.h.Qt的字体提取和X中 ...

  5. 今天修改bug基本完成

    今天修改bug基本完成 在修改bug过程中配到几个郁闷的问题,印象最深的两个1.检查出生日期或日期的合法性,引用的日历控件不能完全保证取到值时操作,现在突然想到或许我该仔细研究日历控件接口,在返回错误 ...

  6. 未在本地计算机上注册"MSDAORA.1"提供程序

    1.在客户机器上部署数据库的时候老是报这个异常. 分析:因为用的是OleDB这个万能驱动, 连接字符串 Provider=MSDAORA.1;Password=CCIM;User ID=CCIM;Da ...

  7. Happy Number——LeetCode

    Write an algorithm to determine if a number is "happy". A happy number is a number defined ...

  8. vijos1891 学姐的逛街计划(线性规划)

    P1891学姐的逛街计划 描述 doc 最近太忙了, 每天都有课. 这不怕, doc 可以请假不去上课.偏偏学校又有规定, 任意连续 n 天中, 不得请假超过 k 天. doc 很忧伤, 因为他还要陪 ...

  9. HDU1050(Moving Tables:贪心算法)

    解题思路: 这种做法是基于hdu2037的做法上考虑的,找出所有可以同时搬运的桌子,然后就很方便求出最短总时间. 还有一种更简单的做法是直接遍历一遍找出与别的重复次数最多的那片区域,重复次数*10就可 ...

  10. 迭代加深搜索算法总结 + Editing a Book UVa11212题解

    迭代加深搜索算法: 对于可以用回溯法解决,但是解答树结点数大的恐怖的问题的一种解决办法,有的问题甚至用bfs连一层节点都遍历不完就超时了.具体方法就是依次枚举搜索层数,从1到一个上限. 结构: int ...