UVA 12663 第九届省赛 高桥与低桥 线段树
题意很简单,n个桥的高度是事先给出来的,然后有m次涨水与落水的高度,问有多少座桥在这m次涨落之后 被淹超过了k次,如果某桥本身被水淹了,此时再涨水,就不能算多淹一次
看下数据10的五次方,10的五次方的硬循环是避免不了了,很明显在计算被淹次数的时候要能缩到logN的复杂度才好。
于是想到先对桥由低到高排一下序,然后获取前一次的落水值和这次的涨水值,只要桥高度在涨落直接的必定是又被淹了一次。要多次对序列的某个区间进行加操作,自然是线段树了,确定区间的时候,就用二分,在进行线段树的时候 用懒惰标记
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #define Lson (rt<<1),l,mid #define Rson (rt<<1|1),mid+1,r #define N 100010 using namespace std; int n,m,k; int d[N*3],maxk[N*3],flag[N*3],A[N]; void up(int rt) {d[rt]=d[rt<<1]+d[rt<<1|1];maxk[rt]=maxk[rt<<1]+maxk[rt<<1|1]; } void pushdown(int rt,int l,int r) {if (l>=r || flag[rt]==0) return;int ll=rt<<1;int rr=rt<<1|1;int mid=(l+r)>>1;d[ll]+=flag[rt];d[rr]+=flag[rt];flag[ll]+=flag[rt];flag[rr]+=flag[rt];flag[rt]=0;if (mid-l+1==1 && d[ll]>=k)maxk[ll]=1;if (r-mid==1 && d[rr]>=k)maxk[rr]=1;// up(rt); } void add(int rt,int l,int r,int L,int R) {if (L<=l && r<=R){pushdown(rt,l,r);d[rt]+=r-l+1;if (l>=r && d[rt]>=k)maxk[rt]=1;flag[rt]++;return;}pushdown(rt,l,r);int mid=(l+r)>>1;if (L<=mid)add(Lson,L,R);if (R>mid)add(Rson,L,R);up(rt); } void incase(int rt,int l,int r) {if (l>=r){if(d[rt]>=k)maxk[rt]=1;return;}pushdown(rt,l,r);int mid=(l+r)>>1;incase(Lson);incase(Rson);up(rt); } void build(int rt,int l,int r) {flag[rt]=0;if(l>=r){d[rt]=0;maxk[rt]=0;flag[rt]=0;return;}int mid=(l+r)>>1;build(Lson);build(Rson);up(rt); } int main() {int kase=0,a,b,cur;while (scanf("%d%d%d",&n,&m,&k)!=EOF){for (int i=1;i<=n;i++){scanf("%d",&A[i]);}sort(A+1,A+1+n);build(1,1,n);cur=1;for (int i=1;i<=m;i++){scanf("%d%d",&a,&b);int l=upper_bound(A+1,A+1+n,cur)-A;int r=upper_bound(A+1,A+1+n,a)-A;r--;if (l<=r)add(1,1,n,l,r);cur=b;}incase(1,1,n);printf("Case %d: %d\n",++kase,maxk[1]);}return 0; }
好久没写线段树了,这个题一写完就WA了,后来发现,首先二分出来的区间先要判断下来,若区间不存在就不要进行插入了,还有就是pushdown,我一开始是计划每次只增加1
,要进行下一次懒惰标记的时候先把上一次 的懒惰标记down下去,结果在pushdown函数里面没判断儿子的标记,如果儿子标记了 也得先down儿子啊。结果这样超时了,还是不能这样,索性就每次懒惰标记直接++,最后把整个标记down下去就行
发现其实d数组完全没有必要的,这个值没有必要维护,只是一开始写的时候没计划的太清,就这样写了。其实没必要。
最后为了避免某个懒惰标记未被down下去,最后还用个incase函数再走一遍线段树,把值给更新一下。
转载于:https://www.cnblogs.com/kkrisen/p/3596760.html
UVA 12663 第九届省赛 高桥与低桥 线段树相关推荐
- nyoj1273 河南省第九届省赛_宣传墙、状压DP+矩阵幂加速
宣传墙 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多.CBA 镇长准备在一条道路南 面 4*N 的墙上做 ...
- 蓝桥杯嵌入式-第九届省赛-电子定时器
/*程序说明: 蓝桥杯大赛嵌入式-第九届省赛-电子定时器软件环境: Keil uVision 4.11 硬件环境: CT117E嵌入式竞赛板(代码兼容ILI932X系列.uc8230液晶控制器)日 期 ...
- 蓝桥杯嵌入式STM32G431——第九届省赛真题电子定时器
第九届省赛真题电子定时器 第九届省赛真题 主函数代码(不包含各模块初始化代码) 按键模块与LCD模块的逻辑图(仅供参考) 第九届省赛真题 主函数代码(不包含各模块初始化代码) #include &qu ...
- csu1335 高桥与低桥
Description 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不 ...
- CSU 1335 高桥和低桥(二分)
高桥和低桥 Description 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥 ...
- 1668: 高桥和低桥
1668: 高桥和低桥 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 42 Solved: 25 [Submit][Status][Web Boar ...
- zcmu-1668: 高桥和低桥
1668: 高桥和低桥 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 38 Solved: 22 [ Submit][ Status][ Web B ...
- 高桥和低桥 (离散化 )
有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不算"淹了两次& ...
- zcmu1668 高桥和低桥
1668: 高桥和低桥 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 42 Solved: 25 [Submit][Status][Web Boar ...
最新文章
- matlab矩阵中如何去掉重复的行;如何找到相同的行,并找到其位置
- 挖掘频繁模式、关联和相关
- mysql ---- innodb-3-锁、事务
- 常用JQuery插件整理
- Qt Creator 使用技巧
- (96)FPGA面试题-Verilog设计半加器
- 【推荐】Zeal 离线API文档浏览器
- 没有基础怎么学Web前端?相关学习路线是什么?
- java jdbc sql 参数_java – Postgresql JDBC表值参数
- vue 中provide的用法_浅谈vue中provide和inject 用法
- YARN调试过程中的常见问题
- Tomcat8.5访问HTML页面出现乱码
- VS2008安装错误,解决方案
- Qt知识回顾(九)——2D绘画
- 使用Arduino解码并发送433MHz RF无线射频信号
- PoE供电技术与应用
- XCode下Swift – WebView IOS demo
- Filtered request failed
- log文件过大处理方法
- 我的移动智能2-corner detection
热门文章
- 华为 任正非说,“很多找工作的人问我,来公司工作有没有双休?需不需要加班?
- python经典程序练习题6:健康食谱的输出。列出5种不同的食材,输出两两之间可能的组合形式
- [z] 人工智能和图形学、图像处理方面的各种会议的评级
- Dynamo相关下载教程分享!(附软件包和Revit使用插件Revit Lookup下载教程)
- CVPR 2021 | Involution:超越卷积和自注意力的神经网络新算子
- Involution
- LeetCode:145. Binary Tree Postorder Traversal
- Redis Cluster 集群管理维护
- 易飞ERP进货单源码——复制报价单
- 小猪猪的matlab学习笔记