题意

长度为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. 高并发WEB服务的演变

    一.越来越多的并发连接数 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战.以最简单粗暴的方式解决,就是增加 Web系统的机器和升级硬件配置.虽然 ...

  2. vue脚手架搭项目 git push超时github网站打不开

    vue: 1.npm install vue-cli -g 全局安装脚手架 2.vue init webpack  name 新建项目 name为项目名称 react: 1..npm install  ...

  3. C# 匹配可空变量

    在 C# 7.0 的时候提供更好用的模式匹配方法,支持通过 is 直接转换对应的类,但是如果是尝试转换可空的对象,那么将会提示无法编译,或转换失败 在 C# 7.0 的 is 转换是十分好用的功能,例 ...

  4. vue 插件大全

    UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开 ...

  5. 2019-5-31-SharpDx-进入全屏模式

    title author date CreateTime categories SharpDx 进入全屏模式 lindexi 2019-5-31 9:5:36 +0800 2019-5-30 20:1 ...

  6. 查看虚拟机里的Centos7的IP(设置centos网卡)

    这里之所以是查看下IP ,是我们后面要建一个Centos远程工具Xshell 连接Centos的时候,需要IP地址,所以我们这里先 学会查看虚拟机里的Centos7的IP地址 首先我们登录操作系统 用 ...

  7. centos 下yum lock的解决办法

    centos 下yum lock的解决办法 centos7下yum install的时候,报了一堆错误,如下: Another app is currently holding the yum loc ...

  8. Elasticsearch慢查询故障诊断

    最近在做ES搜索调优,看了一些lucene搜索的文档和代码,本文用于总结调优过程中学到的知识和自己的思考. 在抓到ES慢查询之后,会通过profile或者kibana的Search Profiler ...

  9. Sybase commands

    (1)update table statistics $table name if we change index info for a table ,such as create or drop i ...

  10. react-native-vector-icons 安装、使用

    react-native-vector-icons 安装.使用 前言 任何库的安装与使用都离不开官文,按照官方文档一步步操作可以规避大多数问题.不过很多库只有英文文档,想要完全参透需要时间.react ...