题目

传送门

Sol

线段树,维护斜率单增的最高点和长度
更新,以下的都是指斜率
当前点的左儿子更新上来,右儿子递归

  • 如果右儿子的左儿子的最大值大于左儿子的
    加上算出右儿子的右儿子的贡献(右儿子贡献减去右儿子的左儿子的贡献),递归右儿子的左儿子
  • 否则,递归右儿子的右儿子
# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
const int _(1e5 + 5);IL int Input(){RG int x = 0, z = 1; RG char c = getchar();for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);return x * z;
}int n, m;
struct Segment{int len, mx;
} T[_ << 2];
double k[_];IL int Update(RG int x, RG int l, RG int r, RG int mx){if(l == r) return k[T[x].mx] > k[mx];RG int mid = (l + r) >> 1, ls = x << 1, rs = ls | 1;if(k[T[ls].mx] > k[mx]) return Update(x << 1, l, mid, mx) + T[x].len - T[ls].len;return Update(x << 1 | 1, mid + 1, r, mx);
}IL int Max(RG int x, RG int y){return k[x] < k[y] ? y : x;
}IL void Modify(RG int x, RG int l, RG int r, RG int p, RG int h){if(l == r){T[x].len = 1, T[x].mx = l;return;}RG int mid = (l + r) >> 1;if(p <= mid) Modify(x << 1, l, mid, p, h);else Modify(x << 1 | 1, mid + 1, r, p, h);T[x].len = T[x << 1].len + Update(x << 1 | 1, mid + 1, r, T[x << 1].mx);T[x].mx = Max(T[x << 1].mx, T[x << 1 | 1].mx);
}int main(RG int argc, RG char *argv[]){n = Input(), m = Input();for(RG int i = 1; i <= m; ++i){RG int x = Input(), y = Input();k[x] = 1.0 * y / (1.0 * x);Modify(1, 1, n, x, y);printf("%d\n", T[1].len);}return 0;
}

转载于:https://www.cnblogs.com/cjoieryl/p/8619775.html

Bzoj2957: 楼房重建相关推荐

  1. [BZOJ2957]楼房重建

    楼房重建 题解 很容易发现,一个楼房能够被看到当且仅当它前面的楼房的斜率都比它的小. 我们显然可以把斜率这东西离散化下来,当成一个权值,所以我们相当于要事实维护有多少个不同的前缀最大值. 首先这应该很 ...

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

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

  3. BZOJ2957 楼房重建

    Description 平面上有\(n\)个位置\(1\dots n\),第\(i\)个位置有一个高为\(H_i\)的楼房:所有\(H\)初始值为\(0\).每次修改一个\(H_i\),求修改后从\( ...

  4. BZOJ2957楼房重建

    传送门  https://www.luogu.org/problemnew/show/P4198 蒟蒻渣渣禹看到这个题时十分不想写线段树emmmm 于是乎....分块!!! 分块.思路就是:如果一个楼 ...

  5. bzoj-2957 楼房重建

    题意: 数轴上有n个楼,分别在1~n这些点上: m次查询.每次改变一个楼的高度,问从(0,0)这个点能够看到多少楼: 题解: 对于一个楼来说要想看到这个楼.那么前面的楼的斜率一定比这个楼小: 那么考虑 ...

  6. BZOJ 2957楼房重建

    传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...

  7. P4198 楼房重建 线段树 + 区间合并

    传送门 文章目录 题意: 思路: 题意: 题面有点问题,按照人类正常的理解来就好啦. 思路: 可以想到维护每个位置的一个斜率,模拟的话就是从第一个位置开始向后选,当某个位置斜率大于当前位置的时候,答案 ...

  8. LG P4198 楼房重建(线段树)

    LG P4198 楼房重建 Solution 基础的线段树题,虽然我还不熟练就是了. 大概就是单点修改,求全局的极大子序列. 我们需要维护一个区间最大值aaa和极大子序列长度sss. 合并xxx的左右 ...

  9. [luogu P4198] 楼房重建(线段树 + 思维)

    luogu 楼房重建 problem solution code problem 洛谷链接 solution 非常巧妙的一道题,对线段树的运用很灵活. 显然这个与原点的连线可以想到将每个点转化为与原点 ...

最新文章

  1. linux 从grub 进入rescue,在grub的rescue模式修复linux引导
  2. 计算机应用基础 实验指导,计算机应用基础实验指导EXCEL
  3. 博士申请 | 普渡大学郭齐教授组招收计算成像全奖博士生
  4. 6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作
  5. sp_MSforeachtable简介; 遍历数据库中的所有表运行命令
  6. Alphabet高管:移动搜索为收入主要增长点 广告形式改进长期获益
  7. java的queue类,java集合类深入分析之Queue篇
  8. 英国科研学术网络Janet遭遇DDoS攻击
  9. Flutter之Container 简单分析
  10. c语言给定n个矩形及其长和宽,七年级数学秋季学期期末考试试题
  11. Protues 8.8 SP1 无需破解 可用直装版 指路
  12. Pr:制作片尾滚动字幕(基本图形法)
  13. 你们要的日文AI实时字幕来了,谷歌浏览器VS小白浏览器AI大比拼
  14. 企业如何自建MDM 移动设备管理平台
  15. 基于matlab的音频处理
  16. 哪个相机可以拍gif动图_摄制 GIF 动图的相机软件
  17. 提高淘宝店铺浏览量的20种方法
  18. 近世代数 笔记与题型连载 第八章(置换群)
  19. 误造没有服务器显示,跑分全球第4!王思聪“随手”装了台服务器,网友:壕无人性...
  20. Java虚拟机崩溃,出现Problematic frame: # C 0x0000000000000000

热门文章

  1. 与其他CA合作签发证书 谷歌赛门铁克之争接近尾声
  2. Android之TextView的样式类Span的使用具体解释
  3. 老张喝茶 教你同步异步 阻塞与非阻塞(转)
  4. [Spring] - 读写分离
  5. css :hover
  6. 【JAVASCRIPT】jquery实现新闻滚动效果
  7. 使用ASV2011研究Molehill API
  8. 为什么要继承Serializable类?
  9. 初创企业不上云拿什么“火拼”?
  10. python 其他函数调用 __init__ 初始化的值