bzoj-2957 楼房重建

原创 2015年07月08日 20:12:19

题意:

数轴上有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;
}


bzoj 2957: 楼房重建(线段树)

2957: 楼房重建 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1143  Solved: 541 [Submit][Status][Di...

【bzoj2957】【楼房重建】【线段树+dp】

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

博客园自定义之博客园公告栏添加时钟——利用canvas画出一个时钟

前言   最近一直在学习前端知识,非常感谢慕课网的讲师Silva Zhou以及w3school的教程让我快速的学习到一门技能,今天学到了如何利用canvas来画出一个时钟,雕虫小技,大神勿喷。  ...

几种快速傅里叶变换(FFT)的C++实现

DFT的的正变换和反变换分别为(1)和(2)式。假设有N个数据,则计算一个频率点需要N次复数乘法和N-1次复数加法,整个DFT需要N*N次复数乘法和N(N-1)次复数加法;由于一次的复数乘法需要进行4...

BZOJ2957 楼房重建

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

BZOJ2957 楼房重建

大家都很强, 可与之共勉。题意:求从1开始的最长上升子序列。题解: 把每个高度转化为斜率,求从1开始的最长上升子序列。 可以发现如果一段楼房能被看见,那么它们跟原点的连线的斜率都是单调递增的。于是...

[BZOJ2957]楼房重建(线段树)

明天就要走啦!今天ATP不用上晚自习啦!
  • FromATP
  • FromATP
  • 2016年11月17日 09:38
  • 173

BZOJ 2957: 楼房重建

这道题还不错….我太蠢了 想不来QAQ 膜了一下线段树做法之后发现还有简单粗暴的分块算法 好劲啊...

[BZOJ 2957] 楼房重建 线段树/分块(两种做法)

题目传送门:【BZOJ 2957】题目分析见下。题目大意:小 A 的楼房外有一大片施工工地,工地上有 N 栋待建的楼房。为了简化问题,我们考虑这些事件发生在一个二维平面上。 小 A 在平面上 ( 0...
  • ArcCCcp
  • ArcCCcp
  • 2017年07月08日 11:59
  • 104

BZOJ - 2957 楼房重建(分块)

2957: 楼房重建 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 692  Solved: 327 [Submit][Status][D...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bzoj-2957 楼房重建
举报原因:
原因补充:

(最多只允许输入30个字)