题意

长度为n的坐标轴上,从1-n上的每一点都有一栋楼房,楼房的初识高度都为0,每一天都有一栋楼房的高度被修改(也可以不变),一栋楼房能被看见当且仅当其最高点与远点的连线不会与其他之前连线相交,问你每天能看见的楼房数是多少。

思路

其实这道题也可以用线段树做,但是感觉更复杂。
预处理
首先我们还是将整个打的区间分块成根号N块,每一段维护两个值,区间楼房高度的最大值,以及区间能被看到的楼房数目,一个块能被看到的楼房高度必定是递增的,所以预处理的时候,只需要记录下一个块内楼房高度递增的楼房与最大值就行了,至于怎么比较高度能否被看见,我们可以比较楼房的斜率,如果斜率大,则一定能被看见。
高度修改
这应该是这道题的难点,怎么进行高度修改,其实仔细想一想也不难。由于只是单点修改,并且不了解被修改原来在块内的具体情况,所以我们可以直接对该点所在的块内进行整块修改,重新统计出最大高度,以及可以被看见的楼房。
查询
由于是统计所有能被看见的楼房,所以就不存在不完整的块的情况,对于每一个块能被看到的楼房数目,必须要大于上一个块的最大高度,所以在块内二分找到大于上一个块的楼房位置就能得到块内可以被看见的楼房数了

代码

#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstdio>
using namespace std;
const int maxn=1e5+20;
int a[maxn],n,m,bl;
double b[maxn];
vector<double> v[400];
void update(int x,int y)
{
b[x]=1.0*y/x;
int pos=a[x];
v[pos].clear();
double kmax=0;
for(int i=bl*(pos-1)+1;i<=min(bl*pos,n);i++){
if(b[i]>kmax)
v[pos].push_back(b[i]),kmax=b[i];
}
}
void query()
{
double kmax=0;
int ans=0;
for(int i=1;i<=a[n];i++){
ans+=(v[i].end()-upper_bound(v[i].begin(),v[i].end(),kmax));
if(!v[i].empty())
kmax=max(kmax,v[i][v[i].size()-1]);
}
printf("%d\n",ans);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i<400;i++)
v[i].clear();
bl=sqrt(n);
for(int i=1;i<=n;i++)
a[i]=(i-1)/bl+1;
for(int i=0;i<m;i++){
int x,y;
scanf("%d%d",&x,&y);
update(x,y);
query();
}
}
return 0;
}

  

(分块)楼房重建 HYSBZ - 2957的更多相关文章

  1. 楼房重建 HYSBZ - 2957

    楼房重建 HYSBZ - 2957 第一次写分块, 写了之后觉得真的是暴力的一比. 题解:先讲n分成 sqrt(n)块,记得补上末尾的, 然后就是对于每一次更新操作, 都重新的讲这个块里面的有效楼放入 ...

  2. 【清华集训】楼房重建 BZOJ 2957

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

  3. bzoj 2957 楼房重建 分块

    楼房重建 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=29 ...

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

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

  5. 【BZOJ2957】楼房重建 分块

    [BZOJ2957]楼房重建 Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子 ...

  6. 【BZOJ 2957】 2957: 楼房重建 (线段树)

    2957: 楼房重建 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1753  Solved: 841 Description 小A的楼房外有一大片施 ...

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

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

  8. 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护

    线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...

  9. BZOJ 2957楼房重建

    传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...

随机推荐

  1. jquery ajax请求步骤

    $.ajax({ type: "GET", url: "/alink-hq/checkCode", data: { "mobile": ph ...

  2. activiti工作流引擎学习(二)

    1.连线 如果bpmn文件和java文件放在同一目录下,需要配置buildPath: 使用流程变量,设置连线需要的流程变量的名称,并设置流程变量的值,流程会按照指定的连线完成任务. 1.1一个活动中可 ...

  3. ie6,7不支持display:inline-block;

    解决方案: display:inline-block; *display:inline;*zoom:1; ie6:* _ ,ie7:*

  4. Python自定义函数的参数

    在Python中自定义的函数可以有三类不同的参数 formal parameters positional arguments Keyword Arguments When a final forma ...

  5. DEVOPS技术实践_07:Jenkins 管道工作

    一 简介 由于在公司构建很多工作,都是使用的maven工作构建的,这种构建方式很大缺点就是所有的工作都需要一步一步的配置,当项目较多,需求变动时,需要很大的精力去修改配置,很费劲 Pipeline即为 ...

  6. idea编辑器的使用

    编辑器下载和安装就不说了,网上每次版本都更换得好快 ,发新版的人很多idea2019:https://pan.baidu.com/s/1zc1wkQLLVxbXSjy4ISN4aQ 提取码:cgah, ...

  7. docker+mysql 更改配置后重启不了的解决方案

    docker+mysql 更改配置后重启不了的解决方案 前提:在最近的项目中,决定将项目改造成数据库读写分离的架构,于是擅自更改生产环境的数据库的配置文件my.cnf,由于我是用docker进行部署的 ...

  8. 解决阿里云专有网络ftp无法远程链接

    配置好ftp后本机测试可用但无法远程连接 网络上找了很多方法,配置防火墙出入站规则均无效 提交阿里云工单,给出解决方法,测试后可用

  9. rsync配置两台服务器之间的文件备份(同步)

    rsync配置两台服务器之间的文件备份(同步) 前情提要 环境: 192.168.1.2 主服务器 centos 7.7 192.168.1.3 备份服务器 centos 7.7 rsync 安装(两 ...

  10. Mysql 性能优化Explain详解

    explain 功能我们在日常使用中,使用慢查询找到执行时间比较久的查询,然后使用SHOW STATUS.SHOW PROFILE.和explain做单条语句的分析.使用explain关键字可以模拟优 ...