bzoj-2957 楼房重建
题意:
数轴上有n个楼,分别在1~n这些点上;
m次查询。每次改变一个楼的高度,问从(0,0)这个点能够看到多少楼;
题解:
对于一个楼来说要想看到这个楼。那么前面的楼的斜率一定比这个楼小;
那么考虑分块的话。就将块中楼的斜率都求出来。
然后维护出一个从块首元素開始的递增序列;
即包含块首元素的下标最小的序列;
扫一遍全部块。取该块之前的全部楼的最大斜率为ma;
在当前块中二分找比ma大的元素个数。并更新ma。
复杂度O(m*√n*log(√n)),时间基本和1s擦边;
可是BZ算的总时限全部能够无压力AC。
代码:
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 110001
using namespace std;
int bk, h[N], cnt[400];
double k[N], q[400][400];
int main()
{int n, m, i, j, index, x, y, ans;double ma;scanf("%d%d", &n, &m);bk = sqrt(n);for (i = 1; i <= m; i++){scanf("%d%d", &x, &y);h[x] = y;k[x] = (double)y / x;index = x / bk;for (j = index*bk, ma = 0, cnt[index] = 0; j <= index*bk + bk - 1; j++)if (k[j] > ma)q[index][++cnt[index]] = k[j], ma = k[j];ma = 0, ans = 0;for (j = 0; j <= n / bk; j++){ans += cnt[j] - (upper_bound(q[j] + 1, q[j] + 1 + cnt[j], ma) - q[j] - 1);ma = max(ma, q[j][cnt[j]]);}printf("%d\n", ans);}return 0;
}
转载于:https://www.cnblogs.com/zfyouxi/p/5390140.html
bzoj-2957 楼房重建相关推荐
- BZOJ 2957楼房重建
传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...
- bzoj 2957: 楼房重建(线段树+递归)
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 2778 Solved: 1314 [Submit][Status][Disc ...
- 【BZOJ—2957楼房重建】【连载:请在T台上微笑】
长久没有发博文了...对对对, 所以最近就趁着暑假多发发吧 颓废是革命的本钱: 推荐一个我喜欢的新连载漫画吧[请在T台上微笑] BZOJ 2957 [楼房重建] Description 小A的楼房外有 ...
- [BZOJ 2957]楼房重建(THU2013集训)(线段树维护单调栈)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 分析: 根据题意,就是比较斜率大小 只看一段区间的话,那么这段区间能看见的楼房数量就是这 ...
- BZOJ 2957: 楼房重建
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- [BZOJ 2957]楼房重建(线段树)
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- bzoj 2957 楼房重建
http://www.elijahqi.win/archives/3479 Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经 ...
- BZOJ 2957 楼房重建-线段树
这个题最主要的是解决一个统计答案的问题. 首先我们注意到,只要考虑右区间的答案统计就好了. 记左区间的最大值为K,当前右区间为P. 我们把当前右区间又分成两个子区间,s1,s2. 那么如果s1的最大值 ...
- BZOJ 2957 楼房重建 (分块)
题解:分块,然后暴力维护每一块上升序列,注意是不是最长上升序列,二分查找第二块中大于第一块的最后一个上升序列中的数. 注意:每一块的大小不要用√n会T掉的,把块的大小设为500-600都可以(T了一页 ...
- 2957: 楼房重建
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 1579 Solved: 754 [Submit][Status][Discu ...
最新文章
- OpenGL multiple lights多光源的实例
- torch.nn.functional.pad(input, pad, mode=‘constant‘, value=0)
- JAVA中文支持指南(Vera Yuanti)
- 阿里巴巴对Java编程【安全规约】的规约
- AVR单片机计算器C语言源程序,AVR单片机简单计算器的Proteus仿真实现+源码
- Flash Player版本相关问题
- WebLogic配置JNDI数据源
- 树莓派之安装dlna服务
- java string与byte互转
- 图形验证码知识点整理 Object.prototype.toString.call()等
- DSP初识-20151111
- [RK3568 Android11] 教程之制作和替换android开机logo图片
- There‘s no Qt version assigned to project xxx.vcxproj for configuration Debug/x64
- 达达php源码,达达房卡麻将二次开发VIP系统学习课程
- Default encoder for format image2 (codec png) is probably disabled. Please choose an encoder manuall
- 小米5 原生android 7.0,发烧米粉看过来!小米5官方版Android 7.0来袭
- 菜鸟网络与顺丰达成和解 确保数据安全进行合作
- 中标麒麟操作系统,yum安装软件时提示:“已加载插件:langpacks,无须任何处理“的解决办法
- c语言图像压缩编码,基于C语言的图像压缩算法
- C++学习笔记与回顾(构造函数、链表等)