售票系统

输入文件:railway.in 输出文件:railway.out 
时间限制:1 s 内存限制:128 MB 
【问题描述】 
某次列车途经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”,表示当前的售票申请被受理或不被受理。 
【输入输出样例】 
Sample Input: 
4 6 4 
1 4 2 
1 3 2 
2 4 3 
1 2 3 
Sample Output: 
YES 
YES 
NO 
NO

线段树+lazy标记 
代码如下:

#include <iostream>
#include <cstdio>
using namespace std;
struct SegTreeNode {
int lc, rc, lazy, sum;
} SegTree[600001 * 4];
int C, S, R;
void Build(int root, int l, int r)
{
SegTree[root].lc = l, SegTree[root].rc = r;
if (l == r)
{
SegTree[root].sum = 0;
return;
}
int mid = (l + r) / 2;
Build(root * 2, l, mid);
Build(root * 2 + 1, mid + 1, r);
SegTree[root].sum = max(SegTree[root * 2].sum, SegTree[root * 2 + 1].sum);
}
void pushdown(int root)
{
int lc = root * 2, rc = root * 2 + 1;
SegTree[lc].lazy += SegTree[root].lazy;
SegTree[rc].lazy += SegTree[root].lazy;
SegTree[lc].sum += SegTree[root].lazy;
SegTree[rc].sum += SegTree[root].lazy;
SegTree[root].lazy = 0;
}
void Modify(int root, int l, int r, int val)
{
if (l == SegTree[root].lc && r == SegTree[root].rc)
{
SegTree[root].lazy += val;
SegTree[root].sum += val;
return;
}
pushdown(root);
int mid = (SegTree[root].lc + SegTree[root].rc) / 2;
if (r <= mid) Modify(root * 2, l, r, val);
else if (l > mid) Modify(root * 2 + 1, l, r, val);
else Modify(root * 2, l, mid, val), Modify(root * 2 + 1, mid + 1, r, val);
SegTree[root].sum = max(SegTree[root * 2].sum, SegTree[root * 2 + 1].sum);
}
int Query(int root, int l, int r)
{
if (l == SegTree[root].lc && r == SegTree[root].rc) return SegTree[root].sum;
pushdown(root);
int mid = (SegTree[root].lc + SegTree[root].rc) / 2;
if (r <= mid) return Query(root * 2, l, r);
else if (l > mid) return Query(root * 2 + 1, l, r);
else
{
int p1 = Query(root * 2, l, mid), p2 = Query(root * 2 + 1, mid + 1, r);
return max(p1, p2);
}
}
int main()
{
ios::sync_with_stdio(false);
freopen("railway.in", "r", stdin);
freopen("railway.out", "w", stdout);
cin >> C >> S >> R;
Build(1, 1, C);
for (int i = 1; i <= R; i++)
{
int O, D, N, res=INT_MAX;
cin >> O >> D >> N;
D--;//这里一定要减一
res = Query(1, O, D);
if (res <= S - N) Modify(1, O, D, N);
if (res <= S - N) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}

  

 

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

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

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

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

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

  3. 【cogs247】售票系统

    [问题描述] 某次列车途经C个城市,城市编号依次为1到C,列车上共有S个座位,铁路局规定售出的车票只能是坐票, 即车上所有的旅客都有座.售票系统是由计算机执行的,每一个售票申请包含三个参数,分别用O. ...

  4. 【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树

    外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个O(log2)的了 #include <cstdio> #include <v ...

  5. P1243~P1247 线段树模板题总结

    前言 这几天刚刚刷了5道线段树(水)题,现在来总结一下. 首先是犯的不少错误: 1.建树.更新函数没有return.这是最气的,每次最后程序错误查了半天也没查出来,最后发现是没有return.递归边界 ...

  6. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  7. 【听说是线段树】bzoj1012 [JSOI2008]最大数maxnumber

    一眼看题目吓了一跳:这TM不就是单调队列吗,200000又怎样,大不了我二分嘛 系统提示:成功开启 手残模式 开始瞎写: #include <cstdio> ]; ]; int m,mod ...

  8. 树(一)——线段树

    问题 现在有1~30这30个数,数N被抽上的概率正比于1/sqrt(N+1),求满足这个概率分布的随机数发生器. 思路 第一,如何解决这个"概率正比"问题. 第二,如何产生满足条件 ...

  9. 线段树好题(2004集训队林涛PPT中的3题)

    1.snake:主要是要意识到全局的可能连法只有一种= =(略坑,题目的最小长度是唬人的……),所以关键就是能否构造出符合题意的图,可以考虑搜索解决,搜出一个就OK了,但是会发现那些满足条件中线段在非 ...

随机推荐

  1. 安卓入门——————简单记账本的开发(用sqlite存储数据)(一)

    设计思想————首先要确定有几个页面.和每个页面的大致布局 由于是入门,我也是学习了不是很长的时间,所以项目比较low.... 第一个页面,也就是打开APP的首页面: 今天这个博客,先实现添加功能!: ...

  2. 高级shell 脚本

    1.函数 函数是一个脚本代码块,你可以为其命名并在代码中任何位置重用.要在脚本中使用该代码块时,只要使用所起的函数名就行了(这个过程称为调用函数).本节将会介绍如何在shell脚本中创建和使用函数 创 ...

  3. 设计模式理解(八)结构型——装饰者模式(记得加上UML图 --- 未完)

    一段时间没写,又忘了,晕...设计模式这种东西一定要经常用. 装饰者模式(Decorator)用于动态地给一个对象增加一些额外的职责,就增加功能来说,他比生成子类更为灵活. 装饰者模式的原则是: 能用 ...

  4. topcoder srm 625 div1

    problem1 link 假设第$i$种出现的次数为$n_{i}$,总个数为$m$,那么排列数为$T=\frac{m!}{\prod_{i=1}^{26}(n_{i}!)}$ 然后计算回文的个数,只 ...

  5. 异常处理与网络基础中的tcp,udp协议

    # 异常处理: # 什么是异常?异常和错误的区别 # Error 语法错误 比较明显的错误 在编译代码阶段就能检测出来 # Iteration 异常 在执行代码的过程中引发的异常 # 异常发生之后的效 ...

  6. webdriver之select、alert、prompt、confirm

    select_by_index()  :通过索引定位select_by_value()  :通过value值定位select_by_visible_text() :通过文本值定位deselect_al ...

  7. LeetCode 05 最长回文子串

    题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...

  8. 从Scratch到Python之角色与造型

    从Scratch到Python之角色与造型 继续讲解通过python turtle从积木编程过渡到代码编程的技巧.角色是scratch中很重要的主角,每个角色可以更换不同的造型或者音效,堆叠不同的积木 ...

  9. 学习笔记78—三大统计相关系数:Pearson、Spearman秩相关系数、kendall等级相关系数

    ****************************************************** 如有谬误,请联系指正.转载请注明出处. 联系方式: e-mail: heyi9069@gm ...

  10. 环境搭建之allure的安装配置,及简单使用

    环境准备 首先是要安装好jdk的电脑上,运行java.javac这些命令都没有问题,要不安装allure时会报错 下载allure 如果直接用Jenkins上的插件,并不需要下载安装 allure官网 ...