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;
}


BZOJ2957 楼房重建(线段树)

【题解】 题目描述有误,一栋楼房可见,应满足其最高点到(0,0)的连线不与其他楼房相交  这个条件可以等价为:它的斜率比之前的任何一个都大(相等也不行) 因此,只需O(logN)修改、O(log...
  • cjk_cjk
  • cjk_cjk
  • 2015年06月21日 15:17
  • 995

bzoj2957 楼房重建

分块/线段树
  • AaronGZK
  • AaronGZK
  • 2016年05月29日 00:16
  • 3613

bzoj2957 楼房重建

线段树
  • u010336344
  • u010336344
  • 2017年04月14日 20:32
  • 152

BZOJ 2957: 楼房重建

这道题还不错….我太蠢了 想不来QAQ 膜了一下线段树做法之后发现还有简单粗暴的分块算法 好劲啊...
  • cgh_Andy
  • cgh_Andy
  • 2017年03月24日 10:11
  • 221

【线段树】bzoj2957:楼房重建

~传送门~Description  小A的楼房外有一大片施工工地,工地上有N栋待建的楼房。每天,这片工地上的房子拆了又建、建了又拆。他经常无聊地看着窗外发呆,数自己能够看到多少栋房子。   为了简化...
  • jmsyzsfq
  • jmsyzsfq
  • 2017年10月12日 21:28
  • 83

BZOJ2957

#include #include #include #include #include using namespace std;const int maxn = 1e5+10;int bl...
  • yxg_123
  • yxg_123
  • 2016年11月06日 12:35
  • 88

【BZOJ2957】楼房重建

Description  小A的楼房外有一大片施工工地,工地上有N栋待建的楼房。每天,这片工地上的房子拆了又建、建了又拆。他经常无聊地看着窗外发呆,数自己能够看到多少栋房子。   为了简化问题,我们...
  • CreationAugust
  • CreationAugust
  • 2015年11月16日 21:15
  • 2144

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

2957: 楼房重建 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 1143  Solved: 541 [Submit][Status][Di...
  • clover_hxy
  • clover_hxy
  • 2016年05月10日 11:49
  • 1039

BZOJ 2957 楼房重建 (分块)

很容易观察到其实就是在找斜率的最长上升序列,分块之后直接处理斜率,怕有精度误差所以用的乘法做判断小于关系,加了一点小优化卡过去了 直接用double表示斜率貌似也可过/***************...
  • Forever_wjs
  • Forever_wjs
  • 2016年10月10日 18:36
  • 235

BZOJ 2957 楼房重建

题目大意: 中文题。 解题思路: 我们狗眼观察可得,可见关系之和右侧最大的斜率有关系。 继续狗眼观察可得,我们修改一个数只会对这个数后面的数造成影响。 那么就可以分为两种情况: ...
  • qq919017553
  • qq919017553
  • 2015年08月29日 21:13
  • 327
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bzoj-2957 楼房重建
举报原因:
原因补充:

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