首页 > 其他分享 >P4198 楼房重建

P4198 楼房重建

时间:2024-02-22 21:05:01浏览次数:23  
标签:return int 楼房 mid lim P4198 区间 重建

P4198 楼房重建

一道优秀线段树题

题目大意,有1至n个位置,每个位置有一个楼房,初始高度为0,高度为\(h_i\)的楼房可以抽象成端点为\((i,0),(i,h_i)\)的线段

你站在\((0,0)\),看到一栋楼的前提是\((0,0)\)与\((i,h_i)\)的连线不与任何线段相交

每次修改一栋楼的高度,问你能看到的楼房有多少

首先考虑求出\((0,0)\)与\((i,h_i)\)的连线的斜率\(k_i\),题目求满足\(\forall_{j<i}k_j<k_i\)的i的个数,考虑线段树维护区间\([l,r]\)的最高点,和其\(\forall_{l\le j<i,l\le i\le r}k_j<k_i\)的个数

然后发现对于两个区间合并,对于题意,左区间一定会选,所以就维护一个询问,在一个区间,有最小高度限定的

\(\forall_{l\le j<i,l\le i\le r}k_j<k_i\&\& \lim<k_i\)的个数

然后发现对于左区间,若最大值大于lim,则右区间一定满足,只用递归左区间

如果最大值小于等于lim,则左区间无贡献,只用递归右区间

然后就可以\(O(n\log^2n)\)解决本题

#include<bits/stdc++.h>
using namespace std;
int n,m,a[100005];
struct node{
	int l;
	double h;
}t[100005<<2];
int ask(int o,int l,int r,double lim){
	if(l==r){
		if(t[o].h>lim) return 1;
		else return 0;
	}int mid=l+r>>1;
	if(t[o].h<=lim) return 0;
	if(t[o*2].h>lim) return t[o].l-t[o*2].l+ask(o*2,l,mid,lim);
	else return ask(o*2+1,mid+1,r,lim);
}
void change(int o,int l,int r,int x,double height){
	if(l==r){
		t[o]={1,height};
		return ;
	}int mid=l+r>>1;
	if(mid>=x) change(o*2,l,mid,x,height);
	else change(o*2+1,mid+1,r,x,height);
	t[o].h=max(t[o*2].h,t[o*2+1].h),t[o].l=t[o*2].l+ask(o*2+1,mid+1,r,t[o*2].h);
}
int main(){
	scanf("%d%d",&n,&m);
	while(m--){
		int w,h;
		scanf("%d%d",&w,&h);
		change(1,1,n,w,1.0*h/w);
		printf("%d\n",t[1].l);
	} 
	return 0;
}

标签:return,int,楼房,mid,lim,P4198,区间,重建
From: https://www.cnblogs.com/zhy114514/p/18028160

相关文章

  • 楼房重建线段树
    维护前缀最大值个数。对pushup操作进行修改。定义solve(x,lim)为前面这个区间的最大值为lim,\(x\)支配的区间产生的贡献。如果\(x\)的最大值已经小于\(lim\),显然没有贡献。考虑\(x\)的左儿子,如果左儿子的最大值大于\(lim\)直接递归左二子查询,此时右儿子的答案不......
  • 代码随想录 day35 柠檬水找零 根据身高重建队列 用最少数量的箭引爆气球
    柠檬水找零就根据几种条件列出来找零情况就行生活经验可知找零当然先给大面额的利于后面的找零根据身高重建队列这题感觉就是先做过队列给糖也难以有思路这里是先按身高先排好队一样身高就k小的排在前面然后再按他前面有几个人直接就给他插到第几个位置就行用最少......
  • openGauss学习笔记-204 openGauss 数据库运维-常见故障定位案例-重建索引失败
    openGauss学习笔记-204openGauss数据库运维-常见故障定位案例-重建索引失败204.1重建索引失败204.1.1问题现象当Desc表的索引出现损坏时,无法进行一系列操作,可能的报错信息如下。index\"%s\"containscorruptedpageatblock%u",RelationGetRelationName(rel),BufferG......
  • 基于ssm的楼房销售系统
    现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本楼房销售系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的......
  • floyd 算法——P1119 灾后重建
    floyd算法是图论中较为简单的最短路算法,但在某些方面远超最短路范围。算法思路定义\(f[x][y]\)为\(x\)到\(y\)节点的最短路径。初始化:若存在边\((x,y)\)则\(f[x][y]\)等于边长度;若不存在,为\(+\infty\)。特别的,\(f[x][x]=0\)。我们考虑一下,\(x,y\)这两个节点通......
  • 我跟你不一样,我的人生是一栋只能建造一次的楼房,我必须让它精确无比,不能有一厘米的差池
    万丈高楼平地起  “合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。”事物都来自点滴的积累,有一个完善的过程,不是一蹴而就的。 《我们不一样》我们不一样每个人都有不同的境遇 ​他的世界里,只有学业、奋斗、事业、成功这样的字眼。所以他说出了:“我跟你不一样,我的......
  • 楼房重建
    这一道题目稍微转换一下题意之后就可以知道需要维护一个斜率单调递增的序列(下文把每个点的斜率称为权值)所以动态维护权值单增序列可以像下面这么做我们根据线段树“分而治之”的思想,用每一个节点维护相似的信息维护什么呢?维护在这一个节点的代表区间中,以这一个节点所代表的区间......
  • Note1 基于MNE实现脑电信号的源定位(重建或成像)
    写在最前最开始接触mne还是在20年,那时候它的版本才刚刚开发到0.21。几年过去他的正式版都已经发布了,而我还依旧是一个学术小白orz。简单调研一下,发现网上关于mne的教程不多,看到脑机接口社区有推出一系列的epoch的mne教程,几位大佬撰写的mne中文手册,另外还有收费培训班。但作为情......
  • 算法题:剑指 Offer 07. 重建二叉树(题目+思路+代码+注释)时空时间优先选O(N) O(N) 2ms击
    题目剑指Offer07.重建二叉树输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。示例1:Input:preorder=[3,9,20,15,7],inorder=[9,3,15,20,7]Output:[3,9,20,null,null,15,7]示例2:Input:......
  • 倾斜摄影三维模型重建的几何坐标变换技术方法浅析
    倾斜摄影三维模型重建的几何坐标变换技术方法浅析 倾斜摄影三维模型数据的坐标变换是将相机坐标系下获取的倾斜摄影图像转换为地理坐标系下的三维模型数据,以实现地理空间信息的表达与分析。在实际应用中,需要进行坐标变换的主要包括航片图像、相机姿态参数和控制点坐标等数据。......