售票系统

输入文件: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. Go语言文件操作

    打开和关闭文件 os.Open()函数能够打开一个文件,返回一个*File和一个err. file.close()方法能够关闭文件. //打开和关闭文件 func main() { file,err ...

  2. 打开visual studio 2010报错:未能正确加载“VSTS for Database Professionals Sql Server Data-tier Application”包

    1  解决: 运行cmd 2  输入:regsvr32 %windir%\system32\jscript.dll

  3. Java延时器

    package listener; import java.util.Timer; import java.util.TimerTask; public class Timeer { /** * sc ...

  4. redis4.0 cluster搭建

    cd /root/tools wget http://pnxcvm0bq.bkt.clouddn.com/redis-4.0.9.tar.gz tar -zxvf redis-4.0.9.tar.gz ...

  5. 第一次使用eclipse出现的问题

    最近开始学习java,在一系列操作下安装好了eclipse后,按照书上的问题写了一个小程序 问题: 用户从键盘只能输入整数,程序输出这些整数的乘积. 看到这个问题后就感觉和c语言蛮像的,首先去ecli ...

  6. Bootstrap常用单词组

    布局容器 .container 固定宽度 .container-fluid 全屏 .row 行 .col-lg- 大屏幕 .col-md- 中屏幕 变量 @grid-columns: 12 列数 @g ...

  7. 理解bootstrap的列偏移offset 和 推拉push/pull的区别?

    参考: http://www.cnblogs.com/jnslove/p/5430481.html & https://blog.csdn.net/hly_coder/article/deta ...

  8. [mysql]You must reset your password using ALTER USER statement before executing this statement.

    原因分析: MySQL版本5.6.6版本起,添加了password_expired功能,它允许设置用户的过期时间.这个特性已经添加到mysql.user数据表,但是它的默认值是”N”,可以使用ALTE ...

  9. ios高级开发之多线程(三)GCD技术

    GCD是基于C的API,它是libdispatch的的市场名称.而libdispatch作为Apple公司的一个库,为并发代码在多核硬件(跑IOS或者OS X)上执行提供有力支持. 那么我们为什么要用 ...

  10. 解决ubuntu无法使用root用户启动Google Chrome浏览器

    1.找到Chrome的路径 # whereis google-chrome google-chrome: /usr/bin/google-chrome /usr/share/man/man1/goog ...