BZOJ2957: 楼房重建(线段树&LIS)
2957: 楼房重建
Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 3727  Solved: 1793
[Submit][Status][Discuss]
Description
  小A的楼房外有一大片施工工地,工地上有N栋待建的楼房。每天,这片工地上的房子拆了又建、建了又拆。他经常无聊地看着窗外发呆,数自己能够看到多少栋房子。
  为了简化问题,我们考虑这些事件发生在一个二维平面上。小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度。如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线段相交,那么这栋楼房就被认为是可见的。
  施工队的建造总共进行了M天。初始时,所有楼房都还没有开始建造,它们的高度均为0。在第i天,建筑队将会将横坐标为Xi的房屋的高度变为Yi(高度可以比原来大---修建,也可以比原来小---拆除,甚至可以保持不变---建筑队这天什么事也没做)。请你帮小A数数每天在建筑队完工之后,他能看到多少栋楼房?
Input
  第一行两个正整数N,M
  接下来M行,每行两个正整数Xi,Yi
Output
M行,第i行一个整数表示第i天过后小A能看到的楼房有多少栋
Sample Input
2 4
3 6
1 1000000000
1 1
Sample Output
1
1
2
数据约定
对于所有的数据1<=Xi<=N,1<=Yi<=10^9
N,M<=100000
此题的LIS值的是,从左方的视野“可见”的哪些房子,我们维护两个东西:
mx:一个区间max
res:这个区间的LIS。
现在我们考虑一个区间,假设这个区间前面的视野高度为pre,那么,那么这个区间的mx小于等于pre,说明贡献为0;否则如果左区间小于等于pre,那么只考虑右区间;否则这个区间的贡献=左区间的贡献+res[now]-res[now<<1|1],因为左区间使用了,那么最大值一定会使用,所以右区间的贡献不变,所以不用下推。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
double mx[maxn];int res[maxn];
void read(int &x){
x=; char c=getchar();
while(c>''||c<'') c=getchar();
while(c>=''&&c<='') x=x*+c-'',c=getchar();
}
int cal(int Now,int L,int R,double pre)
{
if(mx[Now]<=pre) return ;//
if(L==R) return mx[Now]>pre;
int Mid=(L+R)>>;
if(mx[Now<<]<=pre) return cal(Now<<|,Mid+,R,pre);
return cal(Now<<,L,Mid,pre)+res[Now]-res[Now<<];
//由于左边的最大值肯定会使用,所以这种情况下,右边的值不变。
}
void update(int Now,int L,int R,int pos,double h)
{
if(L==R) { mx[Now]=h; res[Now]=; return ;}
int Mid=(L+R)>>;
if(pos<=Mid) update(Now<<,L,Mid,pos,h);
else update(Now<<|,Mid+,R,pos,h);
mx[Now]=max(mx[Now<<],mx[Now<<|]);
if(mx[Now<<]>=mx[Now<<|]) res[Now]=res[Now<<];
else res[Now]=res[Now<<]+cal(Now<<|,Mid+,R,mx[Now<<]);
}
int main()
{
int N,M,p,h; scanf("%d%d",&N,&M);
rep(i,,M){
read(p); read(h);
update(,,N,p,(double)h/p);
printf("%d\n",res[]);
}
return ;
}
BZOJ2957: 楼房重建(线段树&LIS)的更多相关文章
- bzoj2957 楼房重建——线段树
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2957 线段树维护两个值:cnt 能看到的最多楼房数: mx 最大斜率数: 对于一段区间,从左 ...
 - [BZOJ2957] 楼房重建 (线段树,递归)
		
题目链接 Solution 经典的一道线段树题,难点在于如何合并节点. 由于题目要求直线要求不相交,则斜率均大于前面的点即为答案. 所以以斜率为权值. 考虑线段树每一个节点维护两个值: \(Max\) ...
 - bzoj2957楼房重建——线段树
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2957 线段树维护原点到楼顶的斜率,可以知道答案就是从原点开始斜率递增的个数: 记录一个mx数 ...
 - [bzoj2957][楼房重建] (线段树)
		
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
 - [BZOJ29957] 楼房重建 - 线段树
		
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3294 Solved: 1554[Submit][Status][Discus ...
 - bzoj 2957: 楼房重建 线段树
		
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 小A的楼房外有一大片施 ...
 - luogu P4198 楼房重建——线段树
		
题目大意: 小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度.如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线 ...
 - bzoj 2957: 楼房重建 ——线段树
		
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
 - [Luogu P4198]楼房重建(线段树)
		
题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个 ...
 - bzoj 2957 楼房重建 (线段树+思路)
		
链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2957 思路: 用分块可以很简单的过掉,但是这道题也可以用线段树写. 分类讨论左区间最大值对 ...
 
随机推荐
- react分享
			
后台项目应用分享 后台项目应用分享 webpack + react + redux + antd 后台项目应用分享 策略篇 框架选择 组件化开发 组件?组件! CSS in JS下的样式开发思路 展示 ...
 - 前端基础(JavaScript)
			
JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.( ...
 - Educational Codeforces Round 54 (Rated for Div. 2)  Solution
			
A - Minimizing the String solved 题意:给出一个字符串,可以移掉最多一个字符,在所有可能性中选取一个字典序最小的. 思路:显然,一定可以移掉一个字符,如果移掉的字符的后 ...
 - 关于GET POST
			
先说相同点,只有了解了相同点之后才能理解为什么会发生混淆.两者都能向服务器发送数据,提交的“内容”[注1]的格式相同,都是var_1=value_1&var_2=value_2&... ...
 - WinterCamp2017 游记
			
Winter is coming! Day0 Day0前一天打了一轮CF,做完了ABCD,Div2 Rank59.然后就去开开心心的睡觉,准备第二天的行程. 快到一点的时候躺在了床上,睡不着,翻来覆去 ...
 - MVC中定时发布二维码邮件
			
发布邮件 查看第一个方法就可以了,第二个跟这个无关 using System; using System.Collections.Generic; using System.Linq; using S ...
 - P4 PI库安装
			
repo:Github PI P4Runtime - a control plane framework and tools for the P4 programming language 这个是P4 ...
 - TimerPickerDialog 中 onTimeSet 执行两次的问题
			
开发android小闹钟的程序时,在添加闹钟时闹钟列表中总是出现两个相同的闹钟. btnAddAlarm.setOnClickListener(new View.OnClickListener() { ...
 - msgsrvmgr.cpp:5:37: fatal error: kdl_conversions/kdl_msg.h: No such file or directory  #include <kdl_conversions/kdl_msg.h>
			
/home/xxx/ros_workspace/src/bp_protocol_bridge/protospot/src/msgsrvmgr.cpp::: fatal error: kdl_conve ...
 - Autofac Mvc注入
			
private void DependencyInjection() { var builder = new ContainerBuilder(); builder.RegisterControlle ...