bzoj-2957 楼房重建
来源:互联网 发布:stc15w408as数据手册 编辑:程序博客网 时间:2024/04/28 05:21
题意:
数轴上有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 110001using 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;}
0 0
- bzoj 2957 楼房重建
- bzoj 2957: 楼房重建
- bzoj-2957 楼房重建
- BZOJ 2957 楼房重建
- bzoj 2957: 楼房重建
- BZOJ 2957: 楼房重建
- BZOJ 2957 楼房重建
- BZOJ 2957 楼房重建 分块
- BZOJ 2957 楼房重建 分块
- BZOJ 2957 楼房重建 (分块)
- bzoj 2957: 楼房重建(分块)
- BZOJ - 2957 楼房重建(分块)
- bzoj 2957: 楼房重建(线段树)
- Bzoj 2957: 楼房重建(线段树)
- bzoj 2957 楼房重建 线段树维护
- BZOJ 2957 楼房重建 (线段树)
- BZOJ 2957 楼房重建 [分块][线段树]
- BZOJ 2957: 楼房重建 [分块][线段树]
- openstack rpc 原理
- PostgreSQL新手入门
- Makefile 伪目标
- 设置Tomcat的JVM虚拟机内存大小
- 找出数组元素的最大值
- bzoj-2957 楼房重建
- UITableViewCell类学习
- UML 类图学习
- Jetty服务部署调试使用
- linux-redhat6.4驱动无线网卡rtl8188eu
- leetcode 011 —— Container With Most Water
- Java实现从文件中读入写入学生信息并实现增删改
- PHP解析CSV文件为数组
- linux学习笔记