【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\n"); else {printf("YES\n"); add(1,1,c-1,o,d-1,n); } } }