传送门

分析

被线段树按在地上摩擦  先把左边转化成斜率,那么这个题就转化成每次修改一个点的值,输出前缀最大值的个数

看到标签是线段树,所以还是想想线段树的做法吧

既然是线段树,那么就要将区间分成两半,那么左半区间可以直接递归下去做,右半区间就要考虑左半区间对它的影响

左半区间的最大值会对右半区间的前缀最大值的个数造成影响,所以询问时应该带上之前的最大值

考虑一次询问(l,r,x),表示l前面的数的最大值为x,区间(l,r)内的前缀最大值,那么每次就要输出询问(1,n,0)

用dp式子转移的思想对询问进行拆分

设mid=(l+r)/2,mx(l,r)表示l到r内的最大值

如果x>mx(l,mid),那么就左半区间就不可能存在前缀最大值,(l,r,x)的结果就等于(mid,r,x)

如果x<=mx(l,mid),那么询问(l,r,x)就可以拆成(l,mid,x)与(mid+1,r,mx(l,mid))。

注意到(mid+1,r,mx(l,mid))这个东西与x无关,可以在插入值的时候就处理它

所以对于每个询问(l,r,x)真正需要现场求的是(l,mid,x)或(mid,r,x),每次拆分区间长度减半,可以做到logn的复杂度

至于每次插入值修改(mid+1,r,mx(l,mid))时,也可以用同样的方法,总共有logn个区间,每个区间处理的复杂度为logn,所以为long^2n的复杂度

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=;
int n,m,vr[maxn<<];double mx[maxn<<];
int que(int id,int l,int r,double L)
{
if(l==r)return mx[id]>L?:;
int mid=(l+r)>>;
if(L<=mx[id<<])return que(id<<,l,mid,L)+vr[id];
else return que(id<<|,mid+,r,L);
}
void fix(int id,int l,int r,int k,double v)
{
if(l==r){mx[id]=v;return;}
int mid=(l+r)>>;
k<=mid?fix(id<<,l,mid,k,v):fix(id<<|,mid+,r,k,v);
mx[id]=max(mx[id<<],mx[id<<|]);vr[id]=que(id<<|,mid+,r,mx[id<<]);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=,x,y;i<=m;i++)
scanf("%d%d",&x,&y),
fix(,,n,x,double(y)/double(x)),
printf("%d\n",que(,,n,));
}

【洛谷】P4198 楼房重建(线段树)的更多相关文章

  1. 洛谷P4198 楼房重建(线段树)

    题意 题目链接 Sol 别问我为什么发两遍 就是为了骗访问量 这个题的线段树做法,,妙的很 首先一个显然的结论:位置\(i\)能被看到当且仅当\(\frac{H_k}{k} < \frac{H_ ...

  2. 洛谷P4198 楼房重建 (分块)

    洛谷P4198 楼房重建 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题, ...

  3. 洛谷P4198 楼房重建 单调栈+线段树

    正解:单调栈+线段树 解题报告: 传送门! 首先考虑不修改的话就是个单调栈板子题昂,这个就是 然后这题的话,,,我怎么记得之前考试好像有次考到了类似的题目昂,,,?反正我总觉着这方法似曾相识的样子,, ...

  4. luogu P4198 楼房重建——线段树

    题目大意: 小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度.如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线 ...

  5. [Luogu P4198]楼房重建(线段树)

    题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个 ...

  6. 洛谷 P4198 楼房重建 题解

    题面 首先你要知道题问的是什么:使用一种数据结构,动态地维护以1为起点地最长上升子序列(把楼房的高度转化成斜率地序列)的长度: 怎么做?线段树! 我们在线段树上维护两个东西:1.这个区间内斜率的最大值 ...

  7. 洛谷P4198 楼房重建

    题意:给定序列,每次修改一个值,求前缀最大值的个数. 解:线段树经典应用. 每个节点维护最大值和该区间前缀最大值个数. 发现我们不用下传标记,只需要合并区间. 需要实现一个函数int ask([l r ...

  8. 洛谷 P4198 楼房重建

    思路 此题可转化为以下模型 给定序列\(a[1...n]\),支持单点修改,每次求区间单调栈大小 \(n,Q\le 10^5\) 区间单调栈是什么呢?对于一个区间,建立一个栈,首先将第一个元素入栈,从 ...

  9. 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)

    Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...

  10. [BZOJ29957] 楼房重建 - 线段树

    2957: 楼房重建 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 3294  Solved: 1554[Submit][Status][Discus ...

随机推荐

  1. MySQL和SQL Server一些基本用法区别

    具体查看:https://www.cnblogs.com/zhaow/articles/9633554.html 转自:https://www.cnblogs.com/zhaow/articles/9 ...

  2. streamController

  3. Linux内核学习散知识整理

    1.container_of(ptr, type, member) 使用方法:根据指向结构体type的成员member的指针ptr,获取指向改结构体的指针 /** * container_of - c ...

  4. C#MongDB数据库取某时间段内的数据

    BsonDocument bsonDoc = new BsonDocument(); bsonDoc.Add("TimeData", new BsonDocument() { { ...

  5. CAD中如何将图形按一定的比例放大或缩小

    1.双击CAD快捷键图标,打开CAD绘图界面: 2.以正五边形为例,点击左边的正多边形按钮: 3.绘制好后得到五边形图形: 4.给图形做好尺寸标注方便直观比较: 5.选择图像在命令行输入sc命令,按键 ...

  6. manjaro中微信不能输入中文及微信窗口出现透明轮廓的问题

    一.在安装deepin-wine-wechat后,无法切换成中文输入法.网上查找资料,在配置中添加 export 等 均未成功. 后来在官方(https://aur.archlinux.org/pac ...

  7. Python_类的私有属性、私有方法

    1.私有属性:只需要在初始化时,在属性名前加__ class Cup: #构造函数,初始化属性值 def __init__(self,capacity,color): #私有属性,只需要在属性名字前加 ...

  8. mongodb 安装pymongo 驱动

    下载驱动包: https://pypi.org/project/pymongo/ 解压:  tar zxvf pymongo-3.8.0.tar.gz   安装:  python setup.py i ...

  9. ThinkPHP支持的4种路由模式

    下面这个说法和示例,比较具有总结性.

  10. Python 爬虫js加密破解(四) 360云盘登录password加密

    登录链接:https://yunpan.360.cn/mindex/login 这是一个md5 加密算法,直接使用 md5加密即可实现 本文讲解的是如何抠出js,运行代码 第一部:抓包 如图 第二步: ...