正题

题目链接:https://www.luogu.com.cn/problem/P4198


题目大意

\(n\)条线,开始时第\(i\)条是\((i,0)\)的一个点。

每次有操作把第\(x\)条线变成\((x,0)\)到\((x,y)\)。然后求从\((0,0)\)能看到几条线。


解题思路

把线变成斜率的话就是对于每个点求一个往后比它大的第一个点然后一直跳来做了。

线段树的话主要是合并区间的时候比较麻烦,一个暴力的想法是直接维护每个区间的序列,然后合并的时候一个在另一个上面二分,但是这样合并的复杂度是\(O(len)\)的。

发现我们需要的只是在右区间的序列上二分而已,而右区间的序列是由它线段树上的子树得到,所以我们没有必要真正的存下来维护的序列,可以直接在右边的线段树上二分。

大概的操作就是右边分出来的左右两个区间,如果左边的区间最大值要比目前的值要小,那么左边区间没有贡献,直接到右边。否则那么这样跳一定会到达左边区间的最大值,然后就是递归求右边区间的答案,这部分答案我们已经处理完了,直接累加然后递归作左区间即可。

这样时间复杂度就是\(O(n\log^2 n)\)的了


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,m,len[N<<2];
double w[N<<2],a[N];
int PushUp(double val,int x,int L,int R){
if(w[x]<=val)return 0;
if(L==R)return a[L]>val;
int mid=(L+R)>>1;
if(w[x*2]<=val)return PushUp(val,x*2+1,mid+1,R);
return len[x]-len[x*2]+PushUp(val,x*2,L,mid);
}
void Change(int x,int L,int R,int pos,double val){
if(L==R){w[x]=a[L]=val;len[x]=1;return;}
int mid=(L+R)>>1;
if(pos<=mid)Change(x*2,L,mid,pos,val);
else Change(x*2+1,mid+1,R,pos,val);
w[x]=max(w[x*2],w[x*2+1]);
len[x]=len[x*2]+PushUp(w[x*2],x*2+1,mid+1,R);
}
int main()
{
scanf("%d%d",&n,&m);
while(m--){
int x,y;
scanf("%d%d",&x,&y);
Change(1,1,n,x,(double)y/x);
printf("%d\n",len[1]);
}
return 0;
}

P4198-楼房重建【线段树】的更多相关文章

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

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

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

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

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

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

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

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

  5. luogu题解P4198楼房重建--线段树神操作

    题目链接 https://www.luogu.org/problemnew/show/P4198 分析 一句话题意,一条数轴上有若干楼房,坐标为\(xi\)的楼房有高度\(hi\),那么它的斜率为\( ...

  6. bzoj 2957: 楼房重建 线段树

    2957: 楼房重建 Time Limit: 10 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 小A的楼房外有一大片施 ...

  7. bzoj 2957: 楼房重建 ——线段树

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

  8. bzoj2957 楼房重建——线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2957 线段树维护两个值:cnt 能看到的最多楼房数: mx 最大斜率数: 对于一段区间,从左 ...

  9. bzoj 2957 楼房重建 (线段树+思路)

    链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2957 思路: 用分块可以很简单的过掉,但是这道题也可以用线段树写. 分类讨论左区间最大值对 ...

  10. BZOJ 2957 楼房重建(线段树区间合并)

    一个显而易见的结论是,这种数字的值是单调递增的.我们修改一个数只会对这个数后面的数造成影响.考虑线段树划分出来的若干线段. 这里有两种情况: 1.某个线段中的最大值小于等于修改的数,那么这个线段的贡献 ...

随机推荐

  1. shell检查文件内容是否变化

    # 先记录文件的md5 md5sum ip.list >ip.md5 # 记录新的md5与之前的比较 #!/bin/bash md5sum ip.list > .ip.md5 diff i ...

  2. 1、二进制安装K8s 之 环境准备

    二进制安装K8s 之 环境准备 1.系统&软件 序号 设备\系统 版本 1 宿主机 MacBook Pro 11.4 2 系统 Centos 7.8 3 虚拟机 Parallels Deskt ...

  3. asp.net MVC 数据的验证

    join 操作

  4. java 学习推荐

    1.书籍推荐 Java基础:<Java核心技术:卷1基础知识>.<Java编程思想>.<Effective Java> Linux:<鸟哥的Linux私房菜: ...

  5. mybatis根据表逆向自动化生成代码(自动生成实体类、mapper文件、mapper.xml文件)

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  6. Consul 入门-运行

    HashiCorp Consul 是由 HashiCorp 公司开发的,它是一家专注于 DevOps 工具链的公司,旗下的明星级产品包括 Vagrant.Terraform.Vault.Nomad 以 ...

  7. Nginx+Tomcat+Memcached实现session共享

    实验环境: server1:nginx tomcat memcached server2:tomcat memcached Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入 ...

  8. Python - 面向对象编程 - __init__() 构造方法

    什么是构造方法 在创建类时, 可手动添加一个   __init__() 方法,称为构造方法,这是一个实例方法 构造方法用于创建实例对象时使用,每当创建一个类的实例对象时,Python 解释器都会自动调 ...

  9. FastAPI(1)- 简单介绍

    前言 为啥要学它呢,因为学 Flask 的时候发现有人更推荐它代替 Flask,看了下介绍,感觉很强,而且也能拿来做平台,当然学起来!卷起来! 为什么要使用 FastAPI ? 日渐没落的是后端 HT ...

  10. Mysql常用sql语句(6)- limit 限制查询结果的条数

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 实际工作中,我们的数据表数据肯定都是万级别的,如 ...