p1245 售票系统(线段树)

题目描述:

某次列车途经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

(注意:如果输出NO的话说明这个售票申请不合法,那么就直接去掉这个请求所增加的售票数)反正输出YES即可

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int c,s,r,x,y,v;
struct haha
{
    int maxx;
    int delta;
}tree[500000];
void updata(int left,int right,int root)
{
    int mid;
    if((y<left||x>right))
        return;
    if(x<=left&&y>=right)
    {
        tree[root].maxx+=v;
        tree[root].delta+=v;
        return;
    }
    mid=(left+right)/2;
    int del=tree[root].delta;
    tree[root*2].delta+=del; tree[root*2].maxx+=del;
    tree[root*2+1].delta+=del; tree[root*2+1].maxx+=del;
    tree[root].delta=0;
    updata(left,mid,root*2);
    updata(mid+1,right,root*2+1);
    tree[root].maxx=max(tree[root*2].maxx,tree[root*2+1].maxx);
}
int search(int left,int right,int root)
{
    int mid,templ,tempr;
    if(x>right||y<left)
        return -200000;
    if(x<=left&&right<=y)
        return tree[root].maxx;
    mid=(left+right)/2;
    int del=tree[root].delta;
    tree[root*2].delta+=del; tree[root*2].maxx+=del;
    tree[root*2+1].delta+=del; tree[root*2+1].maxx+=del;
    tree[root].delta=0;
    templ=search(left,mid,root*2);
    tempr=search(mid+1,right,root*2+1);
    return max(templ,tempr);
}
int main()
{
    //freopen("add.in","r",stdin);
    //freopen("add.out","w",stdout);
    cin>>c>>s>>r;
    for(int i=1;i<=r;i++)
    {
        int o,d,n;
        cin>>o>>d>>n;
        x=o;
        y=d-1;
        v=n;
        updata(1,c,1);
        int t=search(1,c,1);
        if(t<=s)
            cout<<"YES"<<endl;
        else
        {
            cout<<"NO"<<endl;
            v=-n;
            updata(1,c,1);//把不合法的售票请求去掉
        }
    }
    return 0;
}
时间: 2024-10-25 12:30:17

p1245 售票系统(线段树)的相关文章

P1243~P1247 线段树模板题总结

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

【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

树状数组与线段树

一:树状数组 树状数组是对一个数组改变某个元素和求和比较实用的数据结构.两中操作都是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个以上的空座位时该售票申请才被受理,请你写一个程序,实现这个自动售票系统. 输入 输入文件第一行包含三个用空

【cogs247】售票系统

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

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

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