• tzoj3315 买火车票(线段树+区间更新+区间查最小)


    时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte

    描述

    Byteotian州铁道部决定赶上时代,为此他们引进了城市联网。假设城市联网顺次连接着n 个市从1 到n 编号(起始城市编号为1,终止城市编号为n)。每辆火车有m个座位且在任何两个运送更多的乘客是不允许的。电脑系统将收到连续的预订请求并决定是否满足他们的请求。当火车在请求的路段上有足够的空位时,就通过这个请求,否则不通过。通过请求的一部分是不允许的通过一个请求之后,火车里的空位数目将得到更新。请求应按照收到的顺序依次处理。计算哪些请求可以通过,哪些请求不能通过。

    输入

    输入数据有多组以EOF结束。每组数据第一行是三个被空格隔开整数n, m 和 r (1<=n<=60 000, 1<=m<=60 000,1<=r<=60 000)。数字分别表示:铁路上的城市个数,火车内的座位数,请求的数目。接下来r 行是连窜的请求。第i+1 行描述第i 个请求。描述包含三个整数k1、k2 和 v (1<=k1<k2<=n, 1<=v<=m)。它们分别表示起点车站的编号,目标车站的编号,座位的需求数。

    输出

    输出r行,每行一个字符。'Yes'表示可以通过;'No'表示不能通过。每组输出后面有一个空行。

    样例输入

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

    样例输出

    Yes
    Yes
    No
    No

    假设输入为x,y,z表示在[x,y]站之间需要z个座位

    线段树维护区间最小值,初始全设为m

    每次判断[x,y)区间内最小值>=z则满足,更新区间[x,y)

    更新和判断的区间都是[x,y-1],虽然买的是[x,y],但是最后一站下车,座位是空着的

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 const int MAXN=6e4+5,INF=0x3f3f3f3f;
     7 int st[MAXN<<2],lazy[MAXN<<2];
     8 int n,m;
     9 
    10 void pushup(int rt){
    11     st[rt]=min(st[rt<<1],st[rt<<1|1]);
    12 }
    13 
    14 void pushdown(int rt){
    15     if(lazy[rt]==0)return;
    16     lazy[rt<<1]+=lazy[rt];
    17     lazy[rt<<1|1]+=lazy[rt];
    18     st[rt<<1]-=lazy[rt];
    19     st[rt<<1|1]-=lazy[rt];
    20     lazy[rt]=0;
    21 }
    22 
    23 void build(int l,int r,int rt){
    24     st[rt]=m;
    25     lazy[rt]=0;
    26     if(l==r){
    27         st[rt]=m;
    28         return;
    29     }
    30     int mid=(l+r)>>1;
    31     pushdown(rt);
    32     build(l,mid,rt<<1);
    33     build(mid+1,r,rt<<1|1);
    34     pushup(rt);
    35 }
    36 
    37 void update(int L,int R,int val,int l,int r,int rt){
    38     if(L<=l&&r<=R){
    39         lazy[rt]+=val;
    40         st[rt]-=val;
    41         return;
    42     }
    43     pushdown(rt);
    44     int mid=(l+r)>>1;
    45     if(L<=mid)update(L,R,val,l,mid,rt<<1);
    46     if(R>mid)update(L,R,val,mid+1,r,rt<<1|1);
    47     pushup(rt);
    48 }
    49 
    50 int query(int L,int R,int l,int r,int rt){
    51     if(L<=l&&r<=R)return st[rt];
    52     pushdown(rt);
    53     int mid=(l+r)>>1,res=INF;
    54     if(L<=mid)res=min(res,query(L,R,l,mid,rt<<1));
    55     if(R>mid)res=min(res,query(L,R,mid+1,r,rt<<1|1));
    56     pushup(rt);
    57     return res;
    58 }
    59 
    60 int main(){
    61     int r,x,y,z;
    62     while(~scanf("%d%d%d",&n,&m,&r)){
    63         build(1,n,1);
    64         while(r--){
    65             scanf("%d%d%d",&x,&y,&z);
    66             if(query(x,y-1,1,n,1)>=z){
    67                 printf("Yes
    ");
    68                 update(x,y-1,z,1,n,1);
    69             }
    70             else printf("No
    ");
    71         }
    72         printf("
    ");
    73     }
    74 }
  • 相关阅读:
    狼羊过河问题
    java实现透明窗体
    商人胡萝卜问题
    NXP迅为IMX8开发板Andaoid编译环境搭建
    迅为龙芯2K1000开发板Linux下gcc编译
    迅为恩智浦i.MX8MM开发平台虚拟机安装Ubuntu16.04系统
    恩智浦NXP迅为i.MX6Q开发板资料提升了
    迅为龙芯2K1000开发板Linux工具之make工具和Makefile文件
    迅为瑞芯微3399开发板minimalYocto文件系统的构建
    迅为恩智浦IMX6Q开发板Buildroot 文件系统 alsa 声卡工具测试
  • 原文地址:https://www.cnblogs.com/ChangeG1824/p/11508581.html
Copyright © 2020-2023  润新知