【cogs247】售票系统【线段树】
售票系统
输入文件: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】售票系统【线段树】的更多相关文章
- COGS247. 售票系统[线段树 RMQ]
247. 售票系统 ★★☆ 输入文件:railway.in 输出文件:railway.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 某次列车途经C个城市,城市 ...
- cogs 247. 售票系统 线段树
247. 售票系统 ★★☆ 输入文件:railway.in 输出文件:railway.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 某次列车途经C个城市,城市 ...
- 【cogs247】售票系统
[问题描述] 某次列车途经C个城市,城市编号依次为1到C,列车上共有S个座位,铁路局规定售出的车票只能是坐票, 即车上所有的旅客都有座.售票系统是由计算机执行的,每一个售票申请包含三个参数,分别用O. ...
- 【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树
外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个O(log2)的了 #include <cstdio> #include <v ...
- P1243~P1247 线段树模板题总结
前言 这几天刚刚刷了5道线段树(水)题,现在来总结一下. 首先是犯的不少错误: 1.建树.更新函数没有return.这是最气的,每次最后程序错误查了半天也没查出来,最后发现是没有return.递归边界 ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- 【听说是线段树】bzoj1012 [JSOI2008]最大数maxnumber
一眼看题目吓了一跳:这TM不就是单调队列吗,200000又怎样,大不了我二分嘛 系统提示:成功开启 手残模式 开始瞎写: #include <cstdio> ]; ]; int m,mod ...
- 树(一)——线段树
问题 现在有1~30这30个数,数N被抽上的概率正比于1/sqrt(N+1),求满足这个概率分布的随机数发生器. 思路 第一,如何解决这个"概率正比"问题. 第二,如何产生满足条件 ...
- 线段树好题(2004集训队林涛PPT中的3题)
1.snake:主要是要意识到全局的可能连法只有一种= =(略坑,题目的最小长度是唬人的……),所以关键就是能否构造出符合题意的图,可以考虑搜索解决,搜出一个就OK了,但是会发现那些满足条件中线段在非 ...
随机推荐
- Go语言文件操作
打开和关闭文件 os.Open()函数能够打开一个文件,返回一个*File和一个err. file.close()方法能够关闭文件. //打开和关闭文件 func main() { file,err ...
- 打开visual studio 2010报错:未能正确加载“VSTS for Database Professionals Sql Server Data-tier Application”包
1 解决: 运行cmd 2 输入:regsvr32 %windir%\system32\jscript.dll
- Java延时器
package listener; import java.util.Timer; import java.util.TimerTask; public class Timeer { /** * sc ...
- 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 ...
- 第一次使用eclipse出现的问题
最近开始学习java,在一系列操作下安装好了eclipse后,按照书上的问题写了一个小程序 问题: 用户从键盘只能输入整数,程序输出这些整数的乘积. 看到这个问题后就感觉和c语言蛮像的,首先去ecli ...
- Bootstrap常用单词组
布局容器 .container 固定宽度 .container-fluid 全屏 .row 行 .col-lg- 大屏幕 .col-md- 中屏幕 变量 @grid-columns: 12 列数 @g ...
- 理解bootstrap的列偏移offset 和 推拉push/pull的区别?
参考: http://www.cnblogs.com/jnslove/p/5430481.html & https://blog.csdn.net/hly_coder/article/deta ...
- [mysql]You must reset your password using ALTER USER statement before executing this statement.
原因分析: MySQL版本5.6.6版本起,添加了password_expired功能,它允许设置用户的过期时间.这个特性已经添加到mysql.user数据表,但是它的默认值是”N”,可以使用ALTE ...
- ios高级开发之多线程(三)GCD技术
GCD是基于C的API,它是libdispatch的的市场名称.而libdispatch作为Apple公司的一个库,为并发代码在多核硬件(跑IOS或者OS X)上执行提供有力支持. 那么我们为什么要用 ...
- 解决ubuntu无法使用root用户启动Google Chrome浏览器
1.找到Chrome的路径 # whereis google-chrome google-chrome: /usr/bin/google-chrome /usr/share/man/man1/goog ...