套路套路套路套路套路套路套路套路套路套路。。。


我只能这么说:一道裸得只剩下套路的水题。。。
线段树维护单调栈,显然,能够看到的楼房一定是递增的,但不是按高度递增,而是按高度和坐标的比值递增
所以我们只需要在线段树中维护一个单调栈
$
$
很显然,线段树中一个节点的左子树的答案肯定是有效的,但右子树中的楼房可能会被左边的楼房挡住,所以我们需要计算右边有多少楼房是没有被挡住的。
这里调用一个\(calc\)函数,当我们递归到一个节点时,如果它左子树的最大值已经小于等于查询值,那么它的左子树是不会对答案产生贡献的,那么我们就只需要递归计算右子树;否则,递归处理左子树并加上右子树的答案
$
$

//made by Hero_of_Someone
#include<iostream>
#include<cstdio>
#include<cstdlib>
#define inf (1<<30)
#define N (100010)
#define db double
#define il inline
#define RG register
using namespace std;
il int gi(){ RG int x=0,q=1; RG char ch=getchar(); while( ( ch<'0' || ch>'9' ) && ch!='-' ) ch=getchar();
  if( ch=='-' ) q=-1,ch=getchar(); while(ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; }

struct node{ int ret; db val; }t[N<<2];

int calc(int x,int l,int r,db val){
   if(l==r) return t[x].val>val;
   int mid=(l+r)>>1;
   if(t[x<<1].val<=val) return calc(x<<1|1,mid+1,r,val);
   return t[x].ret-t[x<<1].ret+calc(x<<1,l,mid,val);
}

il void update(int x,int l,int r,int k,db val){
   if(l==r){ t[x].ret=1; t[x].val=val; return ; }
   int mid=(l+r)>>1;
   if(k<=mid) update(x<<1,l,mid,k,val);
   else update(x<<1|1,mid+1,r,k,val);
   t[x].val=max(t[x<<1].val,t[x<<1|1].val);
   t[x].ret=t[x<<1].ret+calc(x<<1|1,mid+1,r,t[x<<1].val);
}

il void work(){
   int n=gi(),m=gi();
   while(m--){
      int x=gi(),y=gi();
      update(1,1,n,x,(db)y/(db)x);
      printf("%d\n",t[1].ret);
   }
}

int main(){ work(); return 0; }

[BZOJ2957] [THU2013集训] 楼房重建的更多相关文章

  1. 【bzoj2957】【楼房重建】另类的线段树(浅尝ACM-H)

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62609346 向大(hei)佬(e)势力学(di ...

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

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

  3. 【BZOJ2957】楼房重建 分块

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

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

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

  5. bzoj 2957: 楼房重建 线段树

    2957: 楼房重建 Time Limit: 10 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 小A的楼房外有一大片施 ...

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

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

  7. 楼房重建 (rebuild)

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

  8. P4198 楼房重建

    P4198 楼房重建 集中写博客= = 首先把高度变成斜率 然后就比较玄学了,首先用线段树维护一个区间的斜率最大值,和只看这个区间时能看见的楼房个数ans 然后更新时先更新max,再处理神奇的ans ...

  9. bzoj 2957 楼房重建 分块

    楼房重建 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=29 ...

随机推荐

  1. # 2017-2018-2 20155319《网络对抗技术》Exp9 :Web安全基础

    2017-2018-2 20155319<网络对抗技术>Exp9 :Web安全基础 实践过程 webgoat准备 从GitHub上下载jar包(老师的虚拟机中有 无需下载) 拷贝到本地,并 ...

  2. MFC如何为程序添加标题

    1.在CMainFrame类中找到函数PreCreateWindow,在该函数中添加 cs.style &=~FWS_ADDTOTITLE;//去掉窗口的 自动标题 属性. 这句很重要不然的话 ...

  3. matplotlib 雷达图2

    说明 搞了一个最新版本的雷达图,比以前那个美观. 不多说,代码奉上: 完整代码 ''' matplotlib雷达图 ''' import numpy as np import matplotlib.p ...

  4. 洛谷 P3302 [SDOI2013]森林

    ->题目链接 题解: #include<queue> #include<cstdio> #include<cstring> #include<iostr ...

  5. 【最详细最完整】在Linux 下如何打包免安装的QT程序?

    在Linux 下如何打包免安装的QT程序? 版权声明:嵌入式linux相关的文章是我的学习笔记,基于Exynos 4412开发板,一部分内容是总结,一部分是查资料所得,大家可以自由转载,但请注明出处! ...

  6. 初识TPOT:一个基于Python的自动化机器学习开发工具

    1. TPOT介绍 一般来讲,创建一个机器学习模型需要经历以下几步: 数据预处理 特征工程 模型选择 超参数调整 模型保存 本文介绍一个基于遗传算法的快速模型选择及调参的方法,TPOT:一种基于Pyt ...

  7. C#_Winfrom将浏览器生成Image

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  8. Jmeter(四)_16个逻辑控制器详解

    循环控制器: 指定其子节点运行的次数,可以使用具体的数值,也可以设置为变量 1:勾选永远:表示一直循环下去 2:如果同时设置了线程组的循环次数和循环控制器的循环次数,那循环控制器的子节点运行的次数为两 ...

  9. saltstack-----master迁移篇

    打包/etc/salt/下的pki文件夹.发送到新的master,然后更改minion的hosts,重启minion,最后重启新master..搞定(salt "*" servic ...

  10. 《Deep Learning》(深度学习)中文版PDF免费下载

    <Deep Learning>(深度学习)中文版PDF免费下载 "深度学习"经典著作<Deep Learning>中文版pdf免费下载. <Deep ...