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

【问题描述】

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

【输入输出样例】

输入:

4 6 4
1 4 2
1 3 2
2 4 3
1 2 3

输出:

YES
YES
NO
NO
题解:区间修改,区间查询最大值。当座位数减最大值小于所要求的票数时输出NO。其他输出YES.
#include<iostream>
#include<cstdio>
using namespace std;
int t[1000001],n,d,o,p[1000001],maxx,minn,s,R,c;
int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
inline void paint(int k,int l,int r,int v)
{
	t[k]+=v;
	if (t[k]>s) t[k]=s;
	p[k]+=v;
}
inline void pushdown(int k,int l,int r)
{
	int mid;
	mid=(l+r)/2;
	paint(k*2,l,mid,p[k]);
	paint(k*2+1,mid+1,r,p[k]);
	p[k]=0;
}
inline void add(int k,int l,int r,int ll,int rr,int v)
{
	int mid;
	if (ll<=l&&r<=rr)
	  {
		paint(k,l,r,v);
		return;
	  }
	mid=(l+r)/2;
	if (ll<=mid) add(k*2,l,mid,ll,rr,v);
	if (rr>mid) add(k*2+1,mid+1,r,ll,rr,v);
    t[k]=max(t[k*2],t[k*2+1]);
}
inline int qmax(int k,int l,int r,int ll,int rr)
{
	int mid,maxx(-1);
	if (ll<=l&&r<=rr) return t[k];
	pushdown(k,l,r);
	mid=(l+r)/2;
	if (ll<=mid) maxx=max(maxx,qmax(k*2,l,mid,ll,rr));
	if (rr>mid) maxx=max(maxx,qmax(k*2+1,mid+1,r,ll,rr));
    return maxx;
}
int main()
{
	freopen("railway.in","r",stdin);
	freopen("railway.out","w",stdout);
	c=read();s=read();R=read();
	for (int i=1;i<=R;i++)
	  {
		 o=read();d=read();n=read();
		 maxx=qmax(1,1,c-1,o,d-1);
		 if (s-maxx<n) printf("NO\n");
		 else {printf("YES\n"); add(1,1,c-1,o,d-1,n); }
	  }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 18:29:45

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

p1245 售票系统(线段树)

题目描述: 某次列车途经C个城市,城市编号依次为1到C,列车上共有S个座位,铁路局规定售出的车票只能是坐票, 即车上所有的旅客都有座.售票系统是由计算机执行的,每一个售票申请包含三个参数,分别用O.D.N表示,O为起始站,D为目的地站,N为车票张数.售票 系统对该售票申请作出受理或不受理的决定,只有在从O到D的区段内列车上都有N个或N个以上的空座位时该售票申请才被受理.请你写一个程序,实现这个自动 售票系统. 输入格式: 第一行包含三个用空格隔开的整数C.S和R,其中1≤C≤60000, l≤S

【cogs247】售票系统

[问题描述] 某次列车途经C个城市,城市编号依次为1到C,列车上共有S个座位,铁路局规定售出的车票只能是坐票, 即车上所有的旅客都有座.售票系统是由计算机执行的,每一个售票申请包含三个参数,分别用O.D.N表示,O为起始站,D为目的地站,N为车票张数.售票 系统对该售票申请作出受理或不受理的决定,只有在从O到D的区段内列车上都有N个或N个以上的空座位时该售票申请才被受理.请你写一个程序,实现这个自动 售票系统. [输入格式] 第一行包含三个用空格隔开的整数C.S和R,其中1≤C≤60000, l

[bzoj3932][CQOI2015]任务查询系统-题解[主席树][权值线段树]

Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行 ),其优先级为Pi.同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同.调度系统会经常向 查询系统询问,第Xi秒正在运行的任务中,优先级最小的Ki个任务(即将任务按照优先级从小到大排序后取前Ki个 )的优先级之和是多少.特别的,如

【BZOJ3932】【CQOI2015】任务查询系统 可持久化线段树

链接: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44937681"); } 题解: 首先肯定要用线段树. 如果没有强制在线,那么直接把询问排个序然后按秩插入.删除.查询.普通线段树就好了,但是这道题强制在线,就需要可持久化线段树了. 线段树的每个区间记录[x:这段区间有的权值总和].

BZOJ 3932 CQOI 2015 任务查询系统 可持久化线段树

题目大意 给出一些任务开始的时间,结束的时间,和优先级.问在第k秒时的第k大优先级,和前k小优先级的和. 思路 CQOI太良心,所有题都是512M. 这个题只需要按照时间轴弄一个可持久化线段树就行了,每个时间点对应着一个权值线段树,维护子节点的和和个数. 注意在没有操作的时候,当前时间点的线段树要复制上一个时间点的线段树. CODE #define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstring> #inclu

P1243~P1247 线段树模板题总结

前言 这几天刚刚刷了5道线段树(水)题,现在来总结一下. 首先是犯的不少错误: 1.建树.更新函数没有return.这是最气的,每次最后程序错误查了半天也没查出来,最后发现是没有return.递归边界要return,递归边界要return,递归边界要return,重要的事情说三遍. 2.判断查找区间于线段的变量写反.听说这个是常犯错误. 然后说一下学线段树的收获.线段树的代码量的确多,很能练自己的思维,而且学的过程中简单的理解了一下#define的用处.线段树用来解决区间查询,区间修改都很方便,

树状数组与线段树

一:树状数组 树状数组是对一个数组改变某个元素和求和比较实用的数据结构.两中操作都是O(logn). 需求:有时候我们需要频繁地求数组的前k项和或者求数组从小标i到j的和,这样每次最坏情况下的时间复杂度就会为O(N),这样效率太低了.而树状数组主要就是为了解决这样一个问题.树状数组在求和及修改都可以在O(lgN)时间内完成. 树状数组需要额外维护一个数组,我们设为C[N],原数组为A[N], 其中每个元素C[i]表示A[i-2^k+1]到A[i]的和,这里k是i在二进制时末尾0的个数.注意通过位

售票系统

售票系统 时间限制: 1 Sec  内存限制: 128 MB 题目描述 某次列车途经C个城市,城市编号依次为1到C,列车上共有S个座位,铁路局规定售出的车票只能是坐票,即车上所有的旅客都有座,售票系统是由计算机执行的,每一个售票申请包含三个参数,分别用O.D.N表示,O为起始站,D为目的地站,N为车票张数,售票系统对该售票申请作出受理或不受理的决定,只有在从O到D的区段内列车上都有N个或N个以上的空座位时该售票申请才被受理,请你写一个程序,实现这个自动售票系统. 输入 输入文件第一行包含三个用空

【题解】售票系统--一道毒瘤题

售票系统 输入文件:railway.in 输出文件:railway.out 时间限制:1 s 内存限制:128 MB [问题描述] 某次列车途经C个城市,城市编号依次为1到C,列车上共有S个座位,铁路局规定售出的车票只能是坐票, 即车上所有的旅客都有座.售票系统是由计算机执行的,每一个售票申请包含三个参数,分别用O.D.N表示,O为起始站,D为目的地站,N为车票张数.售票 系统对该售票申请作出受理或不受理的决定,只有在从O到D的区段内(作者注:这句话是大毒瘤啊!!!)列车上都有N个或N个以上的空