[BZOJ2957] 楼房重建 (线段树,递归)
题目链接
Solution
经典的一道线段树题,难点在于如何合并节点.
由于题目要求直线要求不相交,则斜率均大于前面的点即为答案.
所以以斜率为权值.
考虑线段树每一个节点维护两个值:
- \(Max\) 代表当前节点中的最大值.
- \(Sum\) 代表对于任意一个节点 \(i\) , 其中满足\(w_j>Max(w_{l[i]},w_{l[i]+1}...,w_{r[i]})\)的个数,其中 \(l[i]\),\(r[i]\) 指节点 \(i\) 所在的区间左右端点.\(w\)为斜率.
每一次插入一个节点,它仅会对沿途的最大值和答案产生影响.
然后每次将已经统计好左儿子的 \(Max\) 加入与右儿子中的答案进行比较,递归完成整棵线段树.
然后详情可以看代码.
Code
#include<bits/stdc++.h>
#define N 100008
using namespace std;
struct node{double max;int sum;}sgm[N*4];
int n,m,x,k;
int Calc(int node,double maxn,int l,int r)
{
int mid=(l+r)>>1;
if (l==r) return sgm[node].max>maxn;
if (sgm[node].max<=maxn) return 0;
//如果当前节点最大值均已不能统计,直接返回.
if (sgm[node<<1].max<=maxn) return Calc(node<<1|1,maxn,mid+1,r);
else return sgm[node].sum-sgm[node<<1].sum+Calc(node<<1,maxn,l,mid);
}
void Update(int node,int l,int r,int x,double k)
{
if (l==r)
{
sgm[node].max=k;
sgm[node].sum=1;
return;
}
int mid=(l+r)>>1;
if (x<=mid) Update(node<<1,l,mid,x,k);
else Update(node<<1|1,mid+1,r,x,k);
sgm[node].max=max(sgm[node<<1].max,sgm[node<<1|1].max);
sgm[node].sum=sgm[node<<1].sum+Calc(node<<1|1,sgm[node<<1].max,mid+1,r);
//左边已经处理完,逐层递归返回
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1; i<=m; ++i)
{
scanf("%d%d",&x,&k);
Update(1,1,n,x,k*1.0/x);
printf("%d\n",sgm[1].sum);
}
}
[BZOJ2957] 楼房重建 (线段树,递归)的更多相关文章
- bzoj2957楼房重建——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2957 线段树维护原点到楼顶的斜率,可以知道答案就是从原点开始斜率递增的个数: 记录一个mx数 ...
- bzoj2957 楼房重建——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2957 线段树维护两个值:cnt 能看到的最多楼房数: mx 最大斜率数: 对于一段区间,从左 ...
- [bzoj2957][楼房重建] (线段树)
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- [BZOJ29957] 楼房重建 - 线段树
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3294 Solved: 1554[Submit][Status][Discus ...
- luogu P4198 楼房重建——线段树
题目大意: 小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度.如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线 ...
- bzoj 2957: 楼房重建 ——线段树
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- bzoj 2957: 楼房重建 线段树
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 小A的楼房外有一大片施 ...
- 洛谷P4198 楼房重建(线段树)
题意 题目链接 Sol 别问我为什么发两遍 就是为了骗访问量 这个题的线段树做法,,妙的很 首先一个显然的结论:位置\(i\)能被看到当且仅当\(\frac{H_k}{k} < \frac{H_ ...
- BZOJ 2957 楼房重建(线段树区间合并)
一个显而易见的结论是,这种数字的值是单调递增的.我们修改一个数只会对这个数后面的数造成影响.考虑线段树划分出来的若干线段. 这里有两种情况: 1.某个线段中的最大值小于等于修改的数,那么这个线段的贡献 ...
随机推荐
- java基础编程——树的子结构
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目代码 /** * 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一 ...
- C# 运用作用域
前面已经展示了一些在方法内部创建变量的例子.变量从定义了它的语句开始存在,同一个方法内的后续语句可以使用该变量.换言之,变量只能在创建了之后才能使用.方法执行完毕后,变量也会彻底消失. 假如一个变量能 ...
- arr.forEach()与for...in的用法举例
1.forEach() 将给定的数字转换成罗马数字. 所有返回的 罗马数字 都应该是大写形式. function convert(num) { var str = ""; var ...
- oc字典
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...
- phpstudy配置SSL证书的步骤(Apache环境)以及一些注意事项
准备工具(我自己的): 腾讯云的域名和云主机,还有SSL证书,以及phpstudy 首先要下载自己的SSL证书,会得到一个压缩包,解压以后会得到四个文件夹和一个csr文件, Apache文件夹内三个文 ...
- 第8课 Thinkphp 5 update判断修改成功与失败 Thinkphp5商城第四季
没有修改数据时,判断修改成功与失败 如果提交时的数据库里之前的数据一样(即没有修改就提交表单),会返回0,此时 判断修改成功用$save !== false 这样才会提示修改成功. $save=db( ...
- 学习python第四天 列表
模块的导入是使用 import sys#导入模块sysprint(sys.path)#打印环境变量,可能存在的目录print(sys.argv)#打印脚本的名字,相对路径 import os os.s ...
- Python3爬取人人网(校内网)个人照片及朋友照片,并一键下载到本地~~~附源代码
题记: 11月14日早晨8点,人人网发布公告,宣布人人公司将人人网社交平台业务相关资产以2000万美元的现金加4000万美元的股票对价出售予北京多牛传媒,自此,人人公司将专注于境内的二手车业务和在美国 ...
- 访问tomcat出现HTTP Status 500 - java.lang.IllegalStateException: No output folder
问题:tomcat分为安装版和解压缩版,解压缩版如果解压到安装盘,在浏览器中访问http://localhost:8080,可能会出现500错误,错误提示如下: localhost:8080 jav ...
- time模块和datetime模块详解
一.time模块 time模块中时间表现的格式主要有三种: a.timestamp时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量 b.struct_time时间元组,共 ...