P4198 楼房重建 线段树 + 单调栈
发布日期:2021-09-25 23:57:55
浏览次数:6
分类:技术文章
本文共 1832 字,大约阅读时间需要 6 分钟。
题面有点小问题,个人感觉应该是存在一个点不相交即可。 改成存在的话,理解起来就比较简单了,就是维护每个点到 (0,0) 的斜率,从前往后做一遍单调递增栈得到的单调栈长度即为答案。不过显然需要数据结构来维护,可以考虑线段树。 修改操作的两个区间合并的时候,并不能直接合并,需要发现一些潜在的性质。 (1) 左区间的第一个点一定是要选的 (2) 左区间的最大值一定要选 知道这两点之后,那么答案就是 len( L ) + cal ( R , max_len( L ) ),cal是找右区间大于左区间最大值的单调栈长度。 在cal函数的时候,如果当前区间最大值都 <= x ,那么直接返回0即可。如果递归到叶子结点则根据情况返回 1 或 0。如果左区间的最大值 <= x ,显然左区间的都可以弹掉,递归右区间。否则的话返回 递归左区间 + len(u) - len(L) ,递归左区间比较容易想到,但是为什么不需要处理右区间呢?因为如果可以递归左区间的话,那么说明 左区间的最大值 > x,否则就被弹掉了 ,而我们两个区间的长度都已经是处理好了的,比如找个样例 4 5 6 1 2 8 ,len(u) = 4 ,len(L) = 3 ,我们在没有执行cal函数的时候,已经得到了相应长度,这里保证了两个区间选到的数中,左边选的数 < 右边选的数。那么假设 x = 5 吧,递归左区间返回1,选的这个数是6,右边选的数要保证大于6的话,就应该在 len(u) 中去掉 len(L) 即可。#include#include #include #include #include
转载地址:https://blog.csdn.net/DaNIelLAk/article/details/106980235 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月22日 23时56分33秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Linux下的图形库curses写贪吃蛇,酷
2019-04-27
在asp.net中为Web用户控件添加属性和事件
2019-04-27
datagrid的正反双向排序
2019-04-27
在分页状态下删除纪录的问题
2019-04-27
使用DataGrid动态绑定DropDownList
2019-04-27
DataGrid删除确认及Item颜色交替
2019-04-27
NetBeans配置Xdebug 远程调试PHP
2019-04-27
MediaWiki安装
2019-04-27
Squid安装
2019-04-27
如何查看当前Linux的版本
2019-04-27
Ubuntu安装Nginx
2019-04-27
Ubuntu 下安装thttpd Web服务器
2019-04-27
用thttpd做Web Server
2019-04-27
服务器端开发经验总结 Linux C语言
2019-04-27
将网站程序放在tmpfs下
2019-04-27
使用Nginx的proxy_cache缓存功能取代Squid
2019-04-27
nginx 反向代理,动静态请求分离,proxy_cache缓存及缓存清除
2019-04-27
nginx 的proxy_cache才是王道
2019-04-27
Nginx proxy_cache 使用示例
2019-04-27
Nginx源代码分析 - 日志处理
2019-04-27