(分块)楼房重建 HYSBZ - 2957
题意
长度为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的更多相关文章
- 楼房重建 HYSBZ - 2957
楼房重建 HYSBZ - 2957 第一次写分块, 写了之后觉得真的是暴力的一比. 题解:先讲n分成 sqrt(n)块,记得补上末尾的, 然后就是对于每一次更新操作, 都重新的讲这个块里面的有效楼放入 ...
- 【清华集训】楼房重建 BZOJ 2957
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- bzoj 2957 楼房重建 分块
楼房重建 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=29 ...
- bzoj 2957: 楼房重建 线段树
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 小A的楼房外有一大片施 ...
- 【BZOJ2957】楼房重建 分块
[BZOJ2957]楼房重建 Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子 ...
- 【BZOJ 2957】 2957: 楼房重建 (线段树)
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1753 Solved: 841 Description 小A的楼房外有一大片施 ...
- 洛谷P4198 楼房重建 (分块)
洛谷P4198 楼房重建 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题, ...
- 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护
线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...
- BZOJ 2957楼房重建
传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...
随机推荐
- H3C 示例:计算子网内可用地址数
- 【74.00%】【codeforces 747A】Display Size
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- html2canvas生成图片报错处理办法
详见大佬博客链接: link.(https://www.jianshu.com/p/22bd5b98e38a) 需要注意的是要生成的网页中带的网络图片地址(如放在阿里云服务器图库的图片)经常有跨域报错 ...
- webpack+babel+react+antd技术栈的基础配置
webpack+babel+react+antd技术栈的基础配置 前段时间使用webpack+babel+react+antd做了一套后台管理系统,刚开始被一大堆的新知识压的喘不过气来,压力挺大的.还 ...
- c#中索引器
https://zhidao.baidu.com/question/59675980.html 不是必要的..相当于数学中的一个函数
- sql临时表与变量表
1)临时表存储在 tempdb 中,当不再使用时会自动删除 一般使用如下: --创建临时表 select * into #temp from TABLE --使用临时表 select * from # ...
- Mac Tab自动补全键
最近入手一个Mac(Mac 2019版本),在使用终端时,发现不能使用Tab键自动补全代码,网络搜寻下,发现这里有个方法,记录下,免得自己忘记: 1 / 首先找到这个图标 2 / 输入命令 nano ...
- Mysql(超级详细)
Mysql(超级详细) (黑小子-余) 一.Mysql介绍 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理 ...
- javaweb-实现不同用户登录后跳转到不同界面
今天下午,实现了公文流转系统的一小部分——登录界面验证不同用户跳转到不同界面 Dao package com.office.Dao; import java.sql.Connection; impor ...
- 0006 列表(ul、ol、dl)
1. 列表标签(重点) 学习目标 理解 无序列表的应用场景 自定义列表的应用场景 应用 无序列表语法 自定义列表语法 问? 前面我们知道表格一般用于数据展示的,但是网页中还是有很多跟表格类似的布局,如 ...