zoukankan      html  css  js  c++  java
  • 【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
    ");
    		 else {printf("YES
    "); add(1,1,c-1,o,d-1,n); }
    	  }
    }


  • 相关阅读:
    初识数据库与SQL语句
    初始面向对象
    集合与深浅copy
    函数进阶
    函数操作
    文件操作
    生成器与列表生成式
    函数名的本质,闭包和迭代
    小数据库
    DAY 5 字典
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7086751.html
Copyright © 2011-2022 走看看