luogu题解P4198楼房重建--线段树神操作
题目链接
https://www.luogu.org/problemnew/show/P4198
分析
一句话题意,一条数轴上有若干楼房,坐标为\(xi\)的楼房有高度\(hi\),那么它的斜率为\(hi/xi\),操作包含单元素高度修改,动态询问最长上升斜率序列个数
一开始想什么分治或是离线操作之类的,却因为水平低并不会做,看了题解居然发现就是线段树!看了一下感觉真妙啊,线段树真是个神奇的数据结构
线段树维护两个东西\(sum[now],mx[now]\);
\(sum[now]\)是\(now\)管辖区间\([l,r]\)的最长上升斜率个数
类似的\(mx[now]\)就是那个区间最大斜率,也就是最长上升序列中最右边的
我们假设更新操作递归到\([L,R]\)区间,设\(p\)为\([L,mid]\)区间最大斜率
\(mx[now<<1]\)
那么\([L,R]\)区间的贡献\((sum[now])\)显然等于\([L,mid]\)区间贡献\((sum[now<<1])\) \(+\) 统计\([mid+1,R]\)区间中大于\(p\)的最长上升序列个数.
那么怎么计算\([mid+1,R]\)区间中的大于\(p\)的最长上升序列个数呢,这个我在代码中给出了详细的注释
代码
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cctype>
#include <cstring>
#include <cmath>
#define ll long long
#define ri register int
using std::min;
using std::max;
template <class T>inline void read(T &x){
x=0;int ne=0;char c;
while(!isdigit(c=getchar()))ne=c=='-';
x=c-48;
while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48;
x=ne?-x:x;return ;
}
const int maxn=100005;
const int inf=0x7fffffff;
int n,m,t;
double dta,p;
struct Segment_Tree{
int sum[maxn<<2];//指now管辖的区间内最长上升序列个数
double mx[maxn<<2];//指now管辖区间内最大斜率
int calc(int now,int l,int r){
if(l==r) return mx[now]>p;
int mid=(l+r)>>1;
if(mx[now<<1]<=p)return calc(now<<1|1,mid+1,r);//如果左区间的最大值小于p,那么左区间贡献为0,计算右区间贡献
return sum[now]-sum[now<<1]+calc(now<<1,l,mid);
//如果左区间有贡献,那么右边的不用管,因为sum[now]中本来就是递归到这里时[l,r]区间内最长上升序列个数
//如果左区间已有了贡献,说明左区间存在大于p的值,那么右区间计入sum[now]中的斜率肯定也能对现在答案产生贡献
//但是左区间中有些对sum[now]产生贡献的斜率此时可能小于p,因此答案就是右区间贡献+递归处理左区间贡献
//右区间贡献就是sum[now]-sum[now<<1]
}
void update(int now,int l,int r){
if(l==r){
mx[now]=dta;
sum[now]=1;
return ;
}
int mid=(l+r)>>1;
if(t<=mid)update(now<<1,l,mid);
else update(now<<1|1,mid+1,r);
mx[now]=max(mx[now<<1],mx[now<<1|1]);
p=mx[now<<1];//左区间最大值
sum[now]=sum[now<<1]+calc(now<<1|1,mid+1,r);//计算右区间贡献
return ;
}
}T;
int main(){
int x;
read(n),read(m);
while(m--){
read(t),read(x);
dta=(double)x/t;
T.update(1,1,n);
printf("%d\n",T.sum[1]);
}
return 0;
}
luogu题解P4198楼房重建--线段树神操作的更多相关文章
- luogu P4198 楼房重建——线段树
题目大意: 小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度.如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线 ...
- [Luogu P4198]楼房重建(线段树)
题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个 ...
- 洛谷P4198 楼房重建(线段树)
题意 题目链接 Sol 别问我为什么发两遍 就是为了骗访问量 这个题的线段树做法,,妙的很 首先一个显然的结论:位置\(i\)能被看到当且仅当\(\frac{H_k}{k} < \frac{H_ ...
- 洛谷 P4198 楼房重建 线段树维护单调栈
P4198 楼房重建 题目链接 https://www.luogu.org/problemnew/show/P4198 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上 ...
- 洛谷P4198 楼房重建 (分块)
洛谷P4198 楼房重建 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题, ...
- P4198 楼房重建
P4198 楼房重建 集中写博客= = 首先把高度变成斜率 然后就比较玄学了,首先用线段树维护一个区间的斜率最大值,和只看这个区间时能看见的楼房个数ans 然后更新时先更新max,再处理神奇的ans ...
- [BZOJ29957] 楼房重建 - 线段树
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3294 Solved: 1554[Submit][Status][Discus ...
- bzoj 2957: 楼房重建 线段树
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 小A的楼房外有一大片施 ...
- 【题解】Luogu P4198 楼房重建
原题传送门 根据斜率来建线段树,线段树维护区间最大斜率以及区间内能看见的楼房的数量(不考虑其他地方的原因,两个节点合并时再考虑) 细节见程序 #include <bits/stdc++.h> ...
随机推荐
- 前端知识点回顾之重点篇——ES6的Promise对象
Promise Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大. 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异 ...
- linux中安装python
1.首先切换目录 大型的软件一定要安装在/ opt中 规范 cd /opt 2.下载python3的源码 wget https://www.python.org/ftp/python/3.6.2/P ...
- github上打开或下载过慢的问题解决
1.用站长工具查询github.com http://tool.chinaz.com/dns?type=1&host=github.com&ip= 2.找到“美国[海外]”项查到的ip ...
- zabbix server端与agent端源码安装 自定义监控项
ZabbixServer的安装(只有源码装zabbix才能装支持java) 搭建自定义yum仓库并安装支持包 yum -y install createrepo #下载依赖关系命令 createrep ...
- SQL-W3School-基础:SQL 简介
ylbtech-SQL-W3School-基础:SQL 简介 1.返回顶部 1. SQL 是用于访问和处理数据库的标准的计算机语言. 什么是 SQL? SQL 指结构化查询语言 SQL 使我们有能力访 ...
- 批量执行(Linux命令,上传/下载文件)
前言: 每个公司的网络环境大都划分 办公网络.线上网络,之所以划分的主要原因是为了保证线上操作安全: 对于外部用户而言也只能访问线上网络的特定开放端口,那么是什么控制了用户访问线上网络的呢? 防火墙过 ...
- 几句java代码搞定十万个为什么数据
最近想做一个app,为小朋友推荐十万个为什么的故事,但是找了很久数据,发现挺难的找的,又去写爬虫,发现没有一个好的网站可以爬,最后一个偶然的机会在csdn上发现一个可用的接口,很快就把问题解决了,下面 ...
- R语言与概率统计(六) 主成分分析 因子分析
超高维度分析,N*P的矩阵,N为样本个数,P为指标,N<<P PCA:抓住对y对重要的影响因素 主要有三种:PCA,因子分析,回归方程+惩罚函数(如LASSO) 为了降维,用更少的变量解决 ...
- HTML DOM firstChild lastChild nextSibling previousSibling 属性_获取属性值的undefined问题
<html> <head> <title>HTML示例</title> <style type="text/css"> ...
- 在java中有关于反射的皮毛----自己的简略认知
白首为功名.旧山松竹老,阻归程.欲将心事付瑶琴.知音少,弦断有谁听? 反射(reflection): 当我们在看到这个名词首先会想到的是,我们在上高中时学的物理,那么在java开发中,反射这个名词是怎 ...