【问题描述】

某次列车途经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. yii分页

    关于分页有一个重要的类CPagination. CPagination represents information relevant to pagination. http://www.yiifra ...

  2. POJ-3261-Milk Patterns(后缀数组)

    题意: 给定一个字符串,求至少出现k 次的最长重复子串,这k 个子串可以重叠. 分析: 先二分答案,然后将后缀分成若干组. 不同的是,这里要判断的是有没有一个组的后缀个数不小于k. 如果有,那么存在k ...

  3. HDU 2476 String painter(记忆化搜索, DP)

    题目大意: 给你两个串,有一个操作! 操作时可以把某个区间(L,R) 之间的所有字符变成同一个字符.现在给你两个串A,B要求最少的步骤把A串变成B串. 题目分析: 区间DP, 假如我们直接想把A变成B ...

  4. [转载][HTML] 普通的DIV分层以及版透明效果

    来源忘记哪的了,我稍微做了点修改,想了想还是挂了转载的标签,嗯嗯: <html> <head> <title>EXAMPLE</title> </ ...

  5. HDOJ 2053 Switch Game

    Problem Description There are many lamps in a line. All of them are off at first. A series of operat ...

  6. ASP.Net MVC-Web API使用Entity Framework时遇到Loop Reference

    原文地址:http://www.it165.net/pro/html/201210/3932.html 最近开始研究Web API,运气不错第一个测试项目就遇到问题@@-当新增Control时选择[A ...

  7. 继续畅通工程(kruskal prim)

    kruskal算法   #include <cstdio > #include <algorithm> using namespace std; const int MaxSi ...

  8. 《University Calculus》-chaper13-向量场中的积分-线积分

    线积分: 基于二重积分和三重积分的引入,我们对于线积分的引入过程将会轻车熟路. 对于一根不均匀密度的铜丝,我们如何求其总质量?如下图. 类似二重积分和三重积分的引入,我们首先基于实际问题给出黎曼和的形 ...

  9. H - Parity game-poj1733(需要离散化)

    题意:给一个序列这个序列都是由0和1组成,现在随意拿出来一个序列,然后说出他的和是奇数还是偶数,因为有可能存在假话,让你判断前多少条没有假话,也就是查找第一个假话的位置-1 ///////////// ...

  10. 利用组策略禁用Oultook 各个版本的缓存模式!

    由于缓存模式有些自己特性和企业内的管理策略原因,有些用户不希望使用缓存模式来使用Outlook.我们怎么才能禁用缓存模式呢?请参考如下做法: 首先我们从网站上下载Office 相应的管理adm软件,这 ...