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”
样例输入 Sample Input
4 6 4
1 4 2
1 3 2
2 4 3
1 2 3
样例输出 Sample Output
T
T
N
N‘
’mmzz题目有毒。。。
本来就是个裸地线段树记录最小值。
结果误解他题目了,。
调了三个小时
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 #include<algorithm> 7 #define ls k<<1 8 #define rs k<<1|1 9 using namespace std; 10 const int MAXN=2000001; 11 void read(int &n) 12 { 13 char c='+';int x=0;bool flag=0; 14 while(c<'0'||c>'9') 15 {c=getchar();if(c=='-')flag=1;} 16 while(c>='0'&&c<='9') 17 {x=x*10+c-48,c=getchar();} 18 flag==1?n=-x:n=x; 19 } 20 int n,m,chair; 21 int ans=-1; 22 struct node 23 { 24 int l,r,w,fm; 25 }tree[MAXN*4]; 26 void update(int k) 27 { 28 tree[k].w=min(tree[ls].w,tree[rs].w); 29 30 } 31 void pushdown(int k) 32 { 33 tree[ls].w-=tree[k].fm; 34 tree[rs].w-=tree[k].fm; 35 tree[ls].fm+=tree[k].fm; 36 tree[rs].fm+=tree[k].fm; 37 tree[k].fm=0; 38 //cout<<"ls:"<<(ls)<<" "<<tree[ls].w<<" "; 39 //cout<<"rs:"<<(rs)<<" "<<tree[rs].w<<" "<<endl; 40 } 41 void build_tree(int ll,int rr,int k) 42 { 43 tree[k].l=ll;tree[k].r=rr; 44 if(ll==rr) 45 { 46 tree[k].w=chair; 47 return ; 48 } 49 int mid=(ll+rr)>>1; 50 build_tree(ll,mid,ls); 51 build_tree(mid+1,rr,rs); 52 update(k); 53 } 54 void interval_ask(int ll,int rr,int num,int k) 55 { 56 if(ll>tree[k].r||rr<tree[k].l) 57 return ; 58 if(ll<=tree[k].l&&tree[k].r<=rr) 59 { 60 if(tree[k].w<num) 61 ans=-1; 62 return ; 63 } 64 int mid=(tree[k].l+tree[k].r)>>1; 65 if(tree[k].fm) 66 pushdown(k); 67 if(ll<=mid) 68 interval_ask(ll,rr,num,ls); 69 if(rr>mid) 70 interval_ask(ll,rr,num,rs); 71 if(tree[k].fm) 72 pushdown(k); 73 } 74 void point_change(int pos,int v,int k) 75 { 76 if(pos>tree[k].r||pos<tree[k].l) 77 return ; 78 if(tree[k].l==tree[k].r) 79 { 80 tree[k].w=v; 81 return ; 82 } 83 point_change(pos,v,ls); 84 point_change(pos,v,rs); 85 update(k); 86 } 87 88 void interval_change(int ll,int rr,int num,int k) 89 { 90 if(ll>tree[k].r||rr<tree[k].l) 91 return ; 92 if(ll<=tree[k].l&&rr>=tree[k].r) 93 { 94 tree[k].w-=num; 95 tree[k].fm+=num; 96 return ; 97 } 98 int mid=(tree[k].l+tree[k].r)>>1; 99 if(tree[k].fm) 100 pushdown(k); 101 if(ll<=mid) 102 interval_change(ll,rr,num,ls); 103 if(rr>mid) 104 interval_change(ll,rr,num,rs); 105 update(k); 106 } 107 int main() 108 { 109 read(n);read(chair);read(m); 110 build_tree(1,n,1); 111 for(int i=1;i<=m;i++) 112 { 113 int l,r,num; 114 ans=1; 115 read(l);read(r);read(num); 116 r--; 117 interval_ask(l,r,num,1); 118 if(ans!=1) 119 printf("N\n"); 120 else 121 { 122 interval_change(l,r,num,1); 123 printf("T\n"); 124 } 125 } 126 return 0; 127 }
作者:自为风月马前卒
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。