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


我只能这么说:一道裸得只剩下套路的水题。。。
线段树维护单调栈,显然,能够看到的楼房一定是递增的,但不是按高度递增,而是按高度和坐标的比值递增
所以我们只需要在线段树中维护一个单调栈
$
$
很显然,线段树中一个节点的左子树的答案肯定是有效的,但右子树中的楼房可能会被左边的楼房挡住,所以我们需要计算右边有多少楼房是没有被挡住的。
这里调用一个\(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. OC实现个人中心页面

    AppDelegate.m: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDic ...

  2. WCF来传递DataTable的Bug

    Wcf,客户端与服务器之间在传递DataTable(由于数据库字段不确定暂时用DataTable而不是用实体对象传递)时,发现有的DataTable可以直接传递没有问题 解决方案: DataTable ...

  3. SQL_sql语言的学习

    关系数据库SQL sql基本功能 SQLde 基本概念 主要知识点 1.外模式包含若干视图和部分基本表 2.模式包含若干基本表 3.内模式包含若干存储文件 4操作对象 基本表:本身独立存在的表,一个关 ...

  4. 原创zynq文章整理(MiZ702教程+例程)

    MiZ702教程+例程  网盘链接:  http://pan.baidu.com/s/1sj23yxv 不时会跟新版本,增加勘误之类的,请关注--

  5. 如何完全卸载VS2010(亲自体验过) (转)

    1.首先用360卸载,当卸载完成后,提示有残余的话,就强力清除 2,接着,下载IobitUninstaller工具 3.按照下面进行卸载 1.Microsoft .NET Framework 4 框架 ...

  6. spfa 单源最短路究极算法

    学习博客链接:SPFA 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm.     SPFA算法是西南交通大学段凡丁于1994年发表的.    从名字我 ...

  7. 5、Docker网络配置(单机)

    一.概述 以下内容参考:https://docs.docker.com/network/#network-drivers Docker容器和服务如此强大的原因之一是您可以将它们连接在一起,或者将它们连 ...

  8. grunt源码解析:整体运行机制&grunt-cli源码解析

    前端的童鞋对grunt应该不陌生,前面也陆陆续续的写了几篇grunt入门的文章.本篇文章会更进一步,对grunt的源码进行分析.文章大体内容内容如下: grunt整体设计概览 grunt-cli源码分 ...

  9. pandas 初识(二)

    基本统计 pivot_table(数据透视表 ): 使用appfunc, 按不同index分类统计各特征values的值 df.pivot_table(index="Pclass" ...

  10. 李群与李代数在slam中的应用

    昨天,刚接触道了李群和李代数,查了许多资料,也看了一些视屏.今天来谈谈自己的感受. 李群是有一个挪威数学家提出的,在十九二十世纪得到了很大的发展. 其归于非组合数学,现在简单介绍李群和李代数的概念.群 ...