TZOJ 3315 买火车票(线段树区间最小值)
描述
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
题意
如上
题解
线段树维护当前区间最少空座位数,初始值全设为M
对于每次询问区间[X,Y),查询区间最小值,若>=p,则更新区间[X,Y)-p
代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int N=6e4+5; 5 int m; 6 int minn[N<<2],lazy[N<<2]; 7 void PushDown(int rt) 8 { 9 if(!lazy[rt])return; 10 lazy[rt<<1]+=lazy[rt]; 11 lazy[rt<<1|1]+=lazy[rt]; 12 minn[rt<<1]-=lazy[rt]; 13 minn[rt<<1|1]-=lazy[rt]; 14 lazy[rt]=0; 15 } 16 void Build(int l,int r,int rt) 17 { 18 minn[rt]=m,lazy[rt]=0; 19 if(l==r) 20 { 21 minn[rt]=m; 22 return; 23 } 24 int mid=(l+r)>>1; 25 Build(l,mid,rt<<1); 26 Build(mid+1,r,rt<<1|1); 27 minn[rt]=min(minn[rt<<1],minn[rt<<1|1]); 28 } 29 void Update(int L,int R,int C,int l,int r,int rt) 30 { 31 if(L<=l&&r<=R) 32 { 33 minn[rt]-=C; 34 lazy[rt]+=C; 35 return; 36 } 37 int mid=(l+r)>>1; 38 PushDown(rt); 39 if(L<=mid)Update(L,R,C,l,mid,rt<<1); 40 if(R>mid)Update(L,R,C,mid+1,r,rt<<1|1); 41 minn[rt]=min(minn[rt<<1],minn[rt<<1|1]); 42 } 43 int Query(int L,int R,int l,int r,int rt) 44 { 45 if(L<=l&&r<=R) 46 return minn[rt]; 47 int mid=(l+r)>>1,ans=1e9; 48 PushDown(rt); 49 if(L<=mid)ans=min(ans,Query(L,R,l,mid,rt<<1)); 50 if(R>mid)ans=min(ans,Query(L,R,mid+1,r,rt<<1|1)); 51 minn[rt]=min(minn[rt<<1],minn[rt<<1|1]); 52 return ans; 53 } 54 int main() 55 { 56 int n,r,x,y,p; 57 while(scanf("%d%d%d",&n,&m,&r)!=EOF) 58 { 59 Build(1,n,1); 60 for(int i=0;i<r;i++) 61 { 62 scanf("%d%d%d",&x,&y,&p); 63 int freep=Query(x,y-1,1,n,1); 64 if(freep>=p)Update(x,y-1,p,1,n,1),printf("Yes\n"); 65 else printf("No\n"); 66 } 67 printf("\n"); 68 } 69 return 0; 70 }
转载于:https://www.cnblogs.com/taozi1115402474/p/9464387.html
TZOJ 3315 买火车票(线段树区间最小值)相关推荐
- 【bzoj4355】Play with sequence 线段树区间最值操作
题目描述 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1],...,a[V-1],a[V]都赋值为C. 2)给出参数U,V,C,对于区间[U,V]里的每个数 ...
- 【bzoj4695】最假女选手 线段树区间最值操作
题目描述 给定一个长度为 N 序列,编号从 1 到 N .要求支持下面几种操作: 1.给一个区间[L,R] 加上一个数x 2.把一个区间[L,R] 里小于x 的数变成x 3.把一个区间[L,R] ...
- python:线段树区间修改 + 区间查询 模板 + 坑点总结
from functools import reduceclass SegTree:'''支持增量更新,覆盖更新,序列更新,任意RMQ操作基于二叉树实现初始化:O(1)增量更新或覆盖更新的单次操作复杂 ...
- 树链剖分——线段树区间合并bzoj染色
线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...
- SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并
Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...
- CF911G Mass Change Queries (线段树区间 合并)
题意: 给出一个数列,有q个操作,每种操作是把区间[l,r]中等于x的数改成y.输出q步操作完的数列. 题解: 100个数,很容易想到要从这里进行突破,对于某次操作我们只需要把这个区间的数x给移动到y ...
- hdu 5692 Snacks(dfs序+线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5692 解题思路:这道题是树节点的点权更新,而且涉及到子树,常用的思路是利用dfs序,用线段树来对区间进 ...
- hdu 1698(线段树区间更新)
解题思路:线段树区间更新水题. #include<iostream> #include<cstdio> #include<cstring> using namesp ...
- Tunnel Warfare(HDU1540+线段树+区间合并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...
最新文章
- 一键解锁解题秘籍,从向作者提问开始
- [HNOI2013]切糕
- ORACLE中对LONG类型进行处理的方法
- Linux系统基本命令之vim编辑器的使用
- 【机器学习基础】机器学习训练中常见的问题和挑战!
- 【Linux】一步一步学Linux——Linux内核版本和发行版本(03)
- 03 php,PHP 03 选择结构
- 编程猜单词游戏python_Python实现简单的猜单词小游戏
- HDU 4609——3-idiots
- cat3 utp是不是网线_小科普 | 网线也有高低?聊聊网线的差别
- 数据结构与算法 汉诺塔问题和列车车厢重排问题
- 最小生成树、二分图问题概述
- [label][responsive-web-design]网页响应测试各种尺寸的工具
- CocosBuilder 教程
- python uci_UCI机器学习数据库的Python API介绍
- Java 计算月份天数
- java中finish什么意思,finish是什么意思(你知道Finish 和 Complete 的区别吗?)
- A 'Brief' History of Neural Nets and Deep Learning, Part 4
- java 什么意思_Java中的“ ”是什么意思?
- linux dnf命令安装