HDU2795Biliboard
发布日期:2021-08-19 11:09:59 浏览次数:10 分类:技术文章

本文共 1909 字,大约阅读时间需要 6 分钟。

  用线段树来表示,每个区间节点存储当期区间剩余的最大长度,每次“贴告示”的时候找到区间中最左的且剩余长度大于告示长度的叶节点,将其剩余长度减去告示长度并更新树。

#include
using namespace std;struct lineNode;typedef lineNode lineTree;struct lineNode{ int left, right; int val; lineNode(int l=0, int r=0, int val=0) :left(l), right(r), val(val) {}}nodeArr[800020];void build(int pos, int l, int r, int val){ nodeArr[pos] = lineNode(l, r, val); if (l != r) { build(pos * 2, l, (l + r) / 2, val); build(pos * 2 + 1, (l + r) / 2 + 1, r, val); }}void UpdateVal(int node){ int fatherNode = node / 2; if (fatherNode == 0) { return; } int lVal = nodeArr[fatherNode * 2].val; int rVal = nodeArr[fatherNode * 2 + 1].val; nodeArr[fatherNode].val = lVal > rVal ? lVal : rVal; UpdateVal(fatherNode);}void UpdateNode(int node, int val){ nodeArr[node].val = val; UpdateVal(node);}int findMaxValNode(int tree, int val){ if (nodeArr[tree].left == nodeArr[tree].right) { UpdateNode(tree, nodeArr[tree].val - val); return tree; } if (val <= nodeArr[2 * tree].val) { return findMaxValNode(2 * tree, val); } else if (val <= nodeArr[2 * tree + 1].val) { return findMaxValNode(2 * tree + 1, val); } else { return 0; }}int main(){ int h, w, n; while (cin>>h>>w>>n) { if (h > 200005)h = 200005; build(1, 1, h, w); int wi; for (int i = 0; i < n; ++i) { scanf("%d", &wi); if (nodeArr[1].val < wi)printf("-1\n"); else { int tarNode = findMaxValNode(1, wi); if (tarNode == 0) { printf("-1\n"); } else printf("%d\n", nodeArr[tarNode].left); } } }}
View Code

  另外,如果用指针来表示线段树会MLE。因为线段树是完全二叉树所以用数组来存储是最节约空间的。

转载于:https://www.cnblogs.com/Algorithm-X/p/7528153.html

转载地址:https://blog.csdn.net/weixin_30924087/article/details/96979845 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Linux下对lvm逻辑卷分区大小的调整(针对xfs和ext4不同文件系统)
下一篇:前沿技术

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年03月28日 04时23分57秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

spring boot 与 Ant Design of Vue 实现删除用户(三十) 2019-04-27
spring boot 与 Ant Design of Vue 鉴权体系登录的实现(三十一) 2019-04-27
spring boot 与 Ant Design of Vue 鉴权体系获取用户信息的实现(三十二) 2019-04-27
Druid连接池实现自定义场景的多数据库的连接 2019-04-27
CentOs7命令行(静默)的方式安装oracle数据库 2019-04-27
基于VMware安装CentOs7的镜像 2019-04-27
PL/SQL数据库管理工具的使用 2019-04-27
史上最简单的spring-boot集成websocket的实现方式 2019-04-27
带你玩转属于自己的spring-boot-starter系列(一) 2019-04-27
带你玩转属于自己自己的spring-boot-starter系列(二) 2019-04-27
带你玩转属于自己的spring-boot-starter系列(三) 2019-04-27
基于SnowFlake算法如何让分库分表中不同的ID落在同一个库的算法的实现 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之分库解决方案(二) 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之分表解决方案(一) 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之关联查询解决方案(三) 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之基于seata的分布式事务的解决方案(十五) 2019-04-27
Linux文件管理参考 2019-04-27
FTP文件管理项目(本地云)项目日报(一) 2019-04-27
FTP文件管理项目(本地云)项目日报(二) 2019-04-27
FTP文件管理项目(本地云)项目日报(三) 2019-04-27