【題解】售票系統--一道毒瘤題
阿新 • • 發佈:2018-02-24
申請 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; }
【題解】售票系統--一道毒瘤題