当前位置: 首页 > news >正文

qoj6104 Building Bombing

题意

\(n\) 栋建筑,第 \(i\) 栋建筑的高度为 \(a_i\),一座建筑能从左侧看到仅当它左侧的建筑高度都小于它,问你最少需要爆破几座房子,才能使第 \(l\) 座房子成为能看到的第 \(k\) 高建筑。

\(n\le 10^5,k\le 10\)

思路

首先 \(l\) 要能被看到,因此先把 \(l\) 左边高度大于等于它的全炸了。

由于要求第 \(k\) 高,左边就不用考虑了。

假设 \(l\) 为最左边的建筑,问题就变为了有 \(k\) 栋能看见的建筑需要炸的最小数量。

\(f_{i,j,k}\) 表示第 \([1,i]\) 栋建筑有 \(j\) 栋能看见的建筑,最高的建筑为 \(k\) 需要炸的最少数量。

则有 \(f_{i,j,k}=\min\{f_{i-1,j,k}+[a_k<a_i],f_{i-1,j-1,k'}(k=i,a_k>a_k')\}\),答案即为 \(f_{n,k,k'}\)

\(f\) 的第 \(i\) 维可以使用滚动数组优化。

我们记录下 \(a_i\) 的原始顺序,再把 \(a_i\) 排序,这样对于 \(f_{i,j,k}=f_{i-1,j,k}+[a_k<a_i]\) 就变为了区间加法。

对于 \(f_{i,j,k}=\min\{f_{i-1,j-1,k'}\} \ (k=i,a_k>a_k')\),我们同样可以区间查询最小值。

区间修改求最小值,使用线段树维护 \(f\),可以通过。

http://www.wxhsa.cn/company.asp?id=2832

相关文章:

  • 必知必会:使用serializers.Serializer在views.py视图文件中序列化和反序列化过程的开发模板
  • Cursor小程序实战五:Cursor对接微信两大核心问题
  • 电商系统的Mysql表设计是怎么样呢
  • Docker应用 - CloudSaver
  • SQL查找是否存在,别再count了! - DAYTOY
  • Cursor小程序实战系列二:如何从原型界面到小程序界面
  • Cursor小程序实战系列三: 前后端对接保姆级拆解
  • 课前问题思考2
  • Cursor小程序实战四:如何让AI写好后端代码
  • Web 3
  • Cursor小程序实战系列一:0到1开发一个小程序,需求整理、小程序注册备案
  • 深入解析:MySQL 数据类型与运算符详解
  • 【前端Vue】如何优雅地在vue中引入ace-editor编辑器 - 指南
  • USACO08 OPEN Roads Around the Farm S (递归)
  • JavaScript生成随机数的方法
  • LiveOS 的制作简介
  • .gitignore 文件
  • 目标检测 | 基于Weiler–Atherton算法的IoU求解
  • 对比Java学习Go——函数、集合和OOP
  • MySQL集群高可用架构 - 指南
  • 【WRF-VPRM 预处理器】HEG 安装(服务器)-MRT专业的工具替代
  • 如何在Spring MVC中处理请求参数
  • redis实现缓存2-解决缓存穿透,缓存击穿
  • 单克隆抗体人源化:从鼠源缺陷到全人源突破,3 大阶段破解临床应用难题
  • 在Kubernetes中DaemonSet无法在master节点调度的问题
  • 9 12-
  • 桌面客户端的主要类型和技术方案
  • AGX Orin平台RTC驱动导致reboot系统卡住障碍调试
  • C 语言实现动态数组、链表、栈与队列
  • git reset