题目

传送门

题解

首先转化成到(0,0)(0,0)(0,0)的斜率。

那么就是求多少个点是前缀最大值。

做法是线段树,用gao(i,x)gao(i,x)gao(i,x)表示在iii区间内,之前最大值为xxx的答案。

然后发现gao(p→r,p→l→max)gao(p\to r,p\to l\to max)gao(p→r,p→l→max)就是gao(p,0)−gao(p→l,0)gao(p,0)-gao(p\to l,0)gao(p,0)−gao(p→l,0),所以直接用数组存一下gao(i,0)gao(i,0)gao(i,0)。代码极短,30行。

CODE

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
int n, m, ans[MAXN<<2];
double mx[MAXN<<2];
int query(int i, int l, int r, double v) {
if(l == r) return mx[i] > v;
if(mx[i] <= v) return 0;
int mid = (l + r) >> 1;
if(mx[i<<1] <= v) return query(i<<1|1, mid+1, r, v);
return query(i<<1, l, mid, v) + ans[i]-ans[i<<1];
}
void mdf(int i, int l, int r, int x, double v) {
if(l == r) { mx[i] = v; ans[i] = 1; return; }
int mid = (l + r) >> 1;
if(x <= mid) mdf(i<<1, l, mid, x, v);
else mdf(i<<1|1, mid+1, r, x, v);
mx[i] = max(mx[i<<1], mx[i<<1|1]);
ans[i] = ans[i<<1] + query(i<<1|1, mid+1, r, mx[i<<1]);
}
int main () {
scanf("%d%d", &n, &m);
int x, y;
while(m--) {
scanf("%d%d", &x, &y);
mdf(1, 1, n, x, 1.0*y/x);
printf("%d\n", ans[1]);
}
}

Luogu P4198 楼房重建 (李超线段树)的更多相关文章

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

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

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

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

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

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

  4. BZOJ_2957_楼房重建_线段树

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

  5. Luogu P4097 [HEOI2013]Segment 李超线段树

    题目链接 \(Click\) \(Here\) 李超线段树的模板.但是因为我实在太\(Naive\)了,想象不到实现方法. 看代码就能懂的东西,放在这里用于复习. #include <bits/ ...

  6. luogu P4198 楼房重建——线段树

    题目大意: 小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度.如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线 ...

  7. [Luogu P4198]楼房重建(线段树)

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

  8. Luogu P4198 楼房重建 分块 or 线段树

    思路:分块 提交:2次(第一次的求解有问题) 题解: 设块长为$T$,我们开$N/T$个单调栈,维护每一块的上升斜率. 修改时暴力重构整个块,$O(T)$ 求解时记录一个最大斜率$lst$,然后块内二 ...

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

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

随机推荐

  1. Zuul【入门】

    1.创建eureka-server注册中心工程,配置跟之前讲eureka文章中一样,这里不再赘述 1.1.端口8888 2.创建一个demo-client工程 2.1.demo-client启动类跟之 ...

  2. CF731E Funny Game

    题目描述 一个长度为 N 的序列 ai ,双方轮流操作 每次的操作是选择一个长度大于 1 的前缀,计算它的和 s ,然后 用 s 替换它的前缀,同时当前玩家获得 s 的分数. 当只剩下一个元素,游戏结 ...

  3. Django框架1——视图和URL配置

    三个命令 1.创建一个django项目 在cmd中:django-admin.py startproject project_name D:\python\django_site>django- ...

  4. 【LEETCODE】36、121题,Best Time to Buy and Sell Stock

    package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...

  5. Angular 学习笔记 (Custom Accessor + Mat FormField + Custom select)

    custom form control 之前就写过了,这里简单写一下. 创建一个组件实现 ControlValueAccessor 接口 @Component({ providers: [ { pro ...

  6. 怎样判断当前浏览器是PC浏览器还是手机浏览器

    可以通过检测navigator.userAgent字段中是否有"mobi"字段来检测是PC浏览器还是手机浏览器: /mobi/i.test(window.navigator.use ...

  7. em...刚打完一点cf。。 有点子感悟

    首先,下笔一定要读清楚题目. 情况多考虑一下. 这几次的模拟赛,分类思想很重要,往往一大坨东西扔给你,你不去尝试分类的话就很难整理清楚.

  8. VS.NET(C#-2.5)_简单例子(所有控件都转换成HTML控件)

    简单例子 UI设计视图  UI代码视图 <% @PageLanguage="C#" AutoEventWireup="true"CodeFile=&quo ...

  9. 【转载】Sqlserver根据生日计算年龄

    在Sqlserver中,可以根据存储的出生年月字段计算出该用户的当前年龄信息,主要使用到DateDiff函数来实现.DateDiff函数的格式为DATEDIFF(datepart,startdate, ...

  10. 模板、中间件以及MVC与MTV

    模板 基本数据类型的渲染 {#基础数据类型的渲染#} {#1. 变量#} {{ name }} {#2. 列表#} {#通过点索引可以取值#} {{ list.0 }} {#for循环取值#} {% ...