BZOJ_2957_楼房重建_线段树

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

3 4
2 4
3 6
1 1000000000
1 1

Sample Output

1
1
1
2
数据约定
  对于所有的数据1<=Xi<=N,1<=Yi<=10^9
N,M<=100000

线段树好题,但是我总结不出来任何套路....
决定用线段树维护就多想想维护哪些信息、怎么上传之类的。
先把每个楼房转换成斜率,这样每次我们就是求一个强制上升的子序列有多长。
考虑线段树维护t[p]表示这个节点在只考虑节点对应区间时的答案,mx[p]表示区间最大的斜率。
查询没啥问题。
只需要解决修改时的pushup问题了。
首先左子树的t肯定要累加答案,然后递归右子树。
递归右子树的过程相当于只考虑斜率大于mx[ls]那部分的答案。
同样考虑左子树和右子树。
如果要查的斜率K大于mx[ls]则递归右子树即可。
否则需要递归左子树,此时右子树对应的答案我们已经求过了。
因为K小于等于mx[ls],考虑完左子树之后最大值会变成mx[ls],答案和只考虑左子树的情况下,右子树的答案是一样的,就是t[p]-t[ls]。
每次pushup复杂度O(logn)。
 
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define N 100050
#define ls p<<1
#define rs p<<1|1
typedef double f2;
int t[N<<2],n,m;
f2 mx[N<<2];
int calc(int l,int r,f2 v,int p) {
if(l==r) return mx[p]>v;
int mid=(l+r)>>1;
if(mx[ls]<=v) return calc(mid+1,r,v,rs);
else return calc(l,mid,v,ls)+t[p]-t[ls];
}
void update(int l,int r,int x,f2 v,int p) {
if(l==r) {
t[p]=1; mx[p]=v; return ;
}
int mid=(l+r)>>1;
if(x<=mid) update(l,mid,x,v,ls);
else update(mid+1,r,x,v,rs);
mx[p]=max(mx[ls],mx[rs]);
t[p]=t[ls]+calc(mid+1,r,mx[ls],rs);
}
int main() {
scanf("%d%d",&n,&m);
int i; int x,y;
for(i=1;i<=m;i++) {
scanf("%d%d",&x,&y); update(1,n,x,f2(y)/x,1);
printf("%d\n",t[1]);
}
}

BZOJ_2957_楼房重建_线段树的更多相关文章

  1. 【BZOJ2957】楼房重建(线段树)

    [BZOJ2957]楼房重建(线段树) 题面 BZOJ 题解 对于整个区间维护最大斜率以及只考虑这个区间的答案 考虑如何向上合并. 首先左半段的答案是一定存在的 所以,现在的问题就是右半段能够贡献的答 ...

  2. 【BZOJ 2957】 2957: 楼房重建 (线段树)

    2957: 楼房重建 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1753  Solved: 841 Description 小A的楼房外有一大片施 ...

  3. BZOJ 2957 楼房重建 (线段树)

    题目链接  楼房重建 解题思路:我们可以把楼房的最高点的斜率计算出来.那么问题就转化成了实时查询x的个数,满足数列x的左边没有大于等于x的数. 我们可以用线段树维护 设t[i]为如果只看这个区间,可以 ...

  4. 洛谷 P4198 楼房重建 线段树维护单调栈

    P4198 楼房重建 题目链接 https://www.luogu.org/problemnew/show/P4198 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上 ...

  5. BZOJ2957: 楼房重建(线段树&LIS)

    2957: 楼房重建 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 3727  Solved: 1793[Submit][Status][Discus ...

  6. BZOJ2957 楼房重建 【线段树】

    题目 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个二维 ...

  7. bzoj 2957: 楼房重建【线段树】

    总之就是找前面所有点的斜率都严格小于这个点的这样的点的个数 不管是询问还是修改都非常线段树啊,而且相当眼熟是不是和hotel有点像啊,大概就是区间内记一个len一个max,分别是当前区间答案和区间最大 ...

  8. 【洛谷】P4198 楼房重建(线段树)

    传送门 分析 被线段树按在地上摩擦  先把左边转化成斜率,那么这个题就转化成每次修改一个点的值,输出前缀最大值的个数 看到标签是线段树,所以还是想想线段树的做法吧 既然是线段树,那么就要将区间分成两半 ...

  9. G - 楼房重建 (线段树)

    题目链接:https://cn.vjudge.net/contest/281960#problem/G 题目大意:中文问题 具体思路:首先每一个点的值可以用当前这个点的斜率来表示,每一次输入一个值,我 ...

随机推荐

  1. cheap louis vuitton outlet

    <h1>louis vuitton outlet store</h1>2 nigerian networking systems chosen seeing that enem ...

  2. Linux学习日志--共享内存

    一:什么是共享内存             共享内存是属于IPC(Inter-Process Communication进程间通信)机制,其它两种是信号量和消息队列,该机制为进程开辟创建了特殊的地址范 ...

  3. 一文了解ConfigurationConditon接口

    ConfigurationCondition 接口说明 @Conditional 和 Condition ​ 在了解ConfigurationCondition 接口之前,先通过一个示例来了解一下@C ...

  4. FTP匿名登录或弱口令漏洞及服务加固

    漏洞描述 FTP 弱口令或匿名登录漏洞,一般指使用 FTP 的用户启用了匿名登录功能,或系统口令的长度太短.复杂度不够.仅包含数字.或仅包含字母等,容易被黑客攻击,发生恶意文件上传或更严重的入侵行为. ...

  5. python学习(一)运行第一个python脚本

    当然这里指的是在linux或者unix下,像写bash脚本那样 #!/usr/bin/python print('The Bright Side ' + 'of Life...') 反正我建议就算一开 ...

  6. AWR元数据的迁移或导入到其它数据库

    我们能够将AWR元数据迁移(导入)到其它数据库.低版本号的导入到高版本号,再用高版本号的数据库生成AWR报告,也能使用一些新特性,如 SQL ordered by Physical Reads (Un ...

  7. 【selenium+python】自动化测试目录与文件结构

    一.首先,看一下完整的项目目录结构图,如下: ==================目录结构================== ==================目录结构============== ...

  8. 【虚拟机】WIN8.1系统虚拟机完全彻底删除

    一.首先删除注册表 用管理员身份打开CMD,输入F:\>VMware-workstation-full-12.5.5-5234757.exe/clean,根据自己的虚拟机安装文件的路径进行改变( ...

  9. XMPP协议概述

    XMPP(Extensible Messaging and Presence Protocol,前称Jabber)是一种以 XML 为基础的开放式实时通信协议,关于它的协议细节,网上已经有太多分析文章 ...

  10. 删除rabbitmq的队列和队列中的数据

      访问http://{rabbitmq安装IP}:15672,帐号guest,密码guest(也可以使用自己创建的帐号). 登录后访问http://{rabbitmq安装IP}:15672/#/qu ...