tzoj3315 买火车票(线段树+区间更新+区间查最小)
时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte
描述
Byteotian州铁道部决定赶上时代,为此他们引进了城市联网。假设城市联网顺次连接着n 个市从1 到n 编号(起始城市编号为1,终止城市编号为n)。每辆火车有m个座位且在任何两个运送更多的乘客是不允许的。电脑系统将收到连续的预订请求并决定是否满足他们的请求。当火车在请求的路段上有足够的空位时,就通过这个请求,否则不通过。通过请求的一部分是不允许的通过一个请求之后,火车里的空位数目将得到更新。请求应按照收到的顺序依次处理。计算哪些请求可以通过,哪些请求不能通过。
输入
输入数据有多组以EOF结束。每组数据第一行是三个被空格隔开整数n, m 和 r (1<=n<=60 000, 1<=m<=60 000,1<=r<=60 000)。数字分别表示:铁路上的城市个数,火车内的座位数,请求的数目。接下来r 行是连窜的请求。第i+1 行描述第i 个请求。描述包含三个整数k1、k2 和 v (1<=k1<k2<=n, 1<=v<=m)。它们分别表示起点车站的编号,目标车站的编号,座位的需求数。
输出
输出r行,每行一个字符。'Yes'表示可以通过;'No'表示不能通过。每组输出后面有一个空行。
样例输入
4 6 4
1 4 2
1 3 2
2 4 3
1 2 3
样例输出
Yes
Yes
No
No
假设输入为x,y,z表示在[x,y]站之间需要z个座位
线段树维护区间最小值,初始全设为m
每次判断[x,y)区间内最小值>=z则满足,更新区间[x,y)
更新和判断的区间都是[x,y-1],虽然买的是[x,y],但是最后一站下车,座位是空着的
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 const int MAXN=6e4+5,INF=0x3f3f3f3f; 7 int st[MAXN<<2],lazy[MAXN<<2]; 8 int n,m; 9 10 void pushup(int rt){ 11 st[rt]=min(st[rt<<1],st[rt<<1|1]); 12 } 13 14 void pushdown(int rt){ 15 if(lazy[rt]==0)return; 16 lazy[rt<<1]+=lazy[rt]; 17 lazy[rt<<1|1]+=lazy[rt]; 18 st[rt<<1]-=lazy[rt]; 19 st[rt<<1|1]-=lazy[rt]; 20 lazy[rt]=0; 21 } 22 23 void build(int l,int r,int rt){ 24 st[rt]=m; 25 lazy[rt]=0; 26 if(l==r){ 27 st[rt]=m; 28 return; 29 } 30 int mid=(l+r)>>1; 31 pushdown(rt); 32 build(l,mid,rt<<1); 33 build(mid+1,r,rt<<1|1); 34 pushup(rt); 35 } 36 37 void update(int L,int R,int val,int l,int r,int rt){ 38 if(L<=l&&r<=R){ 39 lazy[rt]+=val; 40 st[rt]-=val; 41 return; 42 } 43 pushdown(rt); 44 int mid=(l+r)>>1; 45 if(L<=mid)update(L,R,val,l,mid,rt<<1); 46 if(R>mid)update(L,R,val,mid+1,r,rt<<1|1); 47 pushup(rt); 48 } 49 50 int query(int L,int R,int l,int r,int rt){ 51 if(L<=l&&r<=R)return st[rt]; 52 pushdown(rt); 53 int mid=(l+r)>>1,res=INF; 54 if(L<=mid)res=min(res,query(L,R,l,mid,rt<<1)); 55 if(R>mid)res=min(res,query(L,R,mid+1,r,rt<<1|1)); 56 pushup(rt); 57 return res; 58 } 59 60 int main(){ 61 int r,x,y,z; 62 while(~scanf("%d%d%d",&n,&m,&r)){ 63 build(1,n,1); 64 while(r--){ 65 scanf("%d%d%d",&x,&y,&z); 66 if(query(x,y-1,1,n,1)>=z){ 67 printf("Yes\n"); 68 update(x,y-1,z,1,n,1); 69 } 70 else printf("No\n"); 71 } 72 printf("\n"); 73 } 74 }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步