http://codevs.cn/problem/1291/
题目描述 Description
某列火车行使在C个城市之间(出发的城市编号为1,结束达到的城市的编号为C),假设该列火车有S个座位,现在有R笔预订票的业务。现在想对这R笔业务进行处理,看哪些预定能满足,哪些不能满足。
一笔预定由O、D、N三个整数组成,表示从起点站O到目标站D需要预定N个座位。一笔预定能满足是指该笔业务在行程范围内有能满足的空座位,否则就不能满足。一笔业务不能拆分,也就是起点和终点站不能更改,预定的座位数目也不能更改。所有的预定需求按给出先后顺序进行处理。
请你编写程序,看那些预定业务能满足,那些不能满足。
输入描述 Input Description
输入文件中的第一行为三个整数C、S、R,(1<=c<=60 000, 1<=s<=60 000, 1<=r<=60 000)他们之间用空隔分开。接下来的R行每行为三个整数O、D、N,(1<=o<d<=c, 1<=n<=s),分别表示每一笔预定业务。
输出描述 Output Description
对第I笔业务,如果能满足,则在输出文件中的第I行输出“T”,否则输出“N”
#include<algorithm> #include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<vector> #include<queue> #include<stack> #include<iomanip> #include<string> #include<climits> #include<cmath> #define MAX 110000 #define LL long long using namespace std; <<; ; LL c,s,r; LL ans,minv; struct Tree { LL l,r; LL sum,mmin,add; }; Tree tree[MAX*]; void pushup(LL x) { LL tmp=*x; tree[x].sum=tree[tmp].sum+tree[tmp+].sum; tree[x].mmin=min(tree[tmp].mmin,tree[tmp+].mmin); } void pushdown(LL x) { LL tmp=*x; tree[tmp].add+=tree[x].add; tree[tmp+].add+=tree[x].add; tree[tmp].mmin+=tree[x].add; tree[tmp+].mmin+=tree[x].add; tree[tmp].sum+=tree[x].add*(tree[tmp].r-tree[tmp].l+); tree[tmp+].sum+=tree[x].add*(tree[tmp+].r-tree[tmp+].l+); tree[x].add=; } void build(int l,int r,int x) { tree[x].l=l; tree[x].r=r; tree[x].add=; if(l==r) { tree[x].sum=startVal+s; tree[x].mmin=startVal+s; return ; } ; ; build(l,mid,tmp); build(mid+,r,tmp+); pushup(x); } void update(LL l,LL r,LL c,LL x) { if(r<tree[x].l||l>tree[x].r) return ; if(l<=tree[x].l&&r>=tree[x].r) { tree[x].add+=c; tree[x].sum+=c*(tree[x].r-tree[x].l+); tree[x].mmin+=c; return ; } if(tree[x].add) pushdown(x); LL tmp=x<<; update(l,r,c,tmp); update(l,r,c,tmp+); pushup(x); } void query(LL l,LL r,LL x) { if(r<tree[x].l||l>tree[x].r) return ; if(l<=tree[x].l&&r>=tree[x].r) { ans+=tree[x].sum; minv=min(minv,tree[x].mmin); return ; } if(tree[x].add) pushdown(x); LL tmp=x<<; LL mid=(tree[x].l+tree[x].r)>>; if(r<=mid) query(l,r,tmp); else if(l>mid) query(l,r,tmp+); else { query(l,mid,tmp); query(mid+,r,tmp+); } } int main() { scanf("%lld %lld %lld",&c,&s,&r); build(,c,); while(r--) { int a,b,c; scanf("%d %d %d",&a,&b,&c);--b;/*!!!*/ update(a,b,-c,); minv=inf;query(a,b,); if(minv<startVal){ printf("N\n"); update(a,b,c,); }else printf("T\n"); } ; }