1. 程式人生 > >【題解】售票系統--一道毒瘤題

【題解】售票系統--一道毒瘤題

申請 mark AI 基本上 reg ring down code 時間限制

  • 售票系統

    輸入文件: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”,表示當前的售票申請被受理或不被受理。

【輸入輸出樣例】

輸入:

4 6 4

1 4 2

1 3 2

2 4 3

1 2 3

輸出:

YES

YES

NO

NO

  • 分析

    題目很容易,就是一個線段樹維護一個動態區間最大值,樣例基本上能一遍過,然後你就交上去就只有......33分。這就是這道題的毒瘤所在,目的地站是不算座位的!!!但是題目描述中卻用了區段這一個模糊的概念實在是氣人,我在WA了之後還是自己在紙上模擬過程才發現這毒瘤之處。

  • 代碼

    如果不會區間動態查詢最大值就看一下吧,其實只要熟練掌握線段樹的思想應該是挺好寫的:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=60010;
int a[maxn],add[maxn<<2],maxx[maxn<<2];
int c,s,r;
int n;
int L,R;
int MAX=0;
void pushup(int now)
{
    maxx[now]=max(maxx[now<<1],maxx[now<<1|1]);
    return ;
}
void build(int now,int l,int r){
    if(l==r){
        maxx[now]=0;
        return;
    }
    int mid=(l+r)>>1;
    build(now<<1,l,mid);
    build(now<<1|1,mid+1,r);
    return ;
}
void pushdown(int now,int ln,int rn)
{
    if(add[now])
    {
        add[now<<1]+=add[now];
        maxx[now<<1]+=add[now]; 
        add[now<<1|1]+=add[now];
        maxx[now<<1|1]+=add[now];
        add[now]=0;

    }
}
void update(int now,int l,int r)
{
    if(L<=l&&r<=R){
        add[now]+=n;
        maxx[now]+=n;
        return;
    }
    int mid=(l+r)>>1;
    pushdown(now,mid-l+1,r-mid);
    if(L<=mid)update(now<<1,l,mid);
    if(mid<R)update(now<<1|1,mid+1,r);
    pushup(now);
    return ; 
}
int query(int now,int l,int r)
{
    if(L<=l&&r<=R){
        return maxx[now];
    }
    int mid=(l+r)>>1;
    pushdown(now,mid-l+1,r-mid);
    if(L<=mid)MAX=max(MAX,query(now<<1,l,mid));
    if(mid<R)MAX=max(MAX,query(now<<1|1,mid+1,r));
    return MAX;
}
int main()
{
    freopen("railway.in","r",stdin);
    freopen("railway.out","w",stdout);
    cin>>c>>s>>r;
    for(register int i=1;i<=r;i++)
    {
        MAX=0;
        scanf("%d %d %d",&L,&R,&n);
        R=R-1;   //註意
        update(1,1,c);
        if(query(1,1,c)>s){
            puts("NO");
            n=-n;
            update(1,1,c);
        }
        else {
            puts("YES");
        }
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}

【題解】售票系統--一道毒瘤題