首页 > TAG信息列表 > P4198

洛谷 P4198 楼房重建

洛谷传送门 一道线段树维护区间前缀最大值个数的好题。 思路 易得连接 \((0,0),(i,H_i)\) 的线段斜率为 \(s_i = \frac{H_i}{i}\)。则题要求的就是满足 \(i \in [1,n], s_i > \max\limits_{j=1}^{i-1} s_j\) 的 \(i\) 的个数。考虑线段树维护。 线段树上每个结点维护当前区间 \([l

P4198 楼房重建 题解

一道线段树题目,思路很巧妙。 首先先转化一下题意,发现如果后面的楼房能够被前面的挡住,一定是后面楼房的斜率比前面楼房小,斜率就是 \(\dfrac{H_i}{i}\),于是这道题变成了单点修改,全局查询哪几个点斜率是前缀最大值中的最大值。 维护两个值 \(ans,Maxn\) 分别表示只存在这个区间时的答

P4198 楼房重建 题解

Description Luogu传送门 Solution 不难想到用斜率来计算能看到多少栋楼房,由于哪些楼房能看到哪些不能被看到是固定的,所以不是单调队列优化\(dp\)什么的。 暴力做法是 \(O(n^2)\) 的,我们考虑用线段树来维护。 线段树里记录两个值,\(len\) 和 \(maxs\)。 \(len\):表示当前区间能看

P4198 楼房重建 题解

题目大意 P4198 楼房重建 在一个平面内,求出所有的高度大于00的点与(0,0)(0,0)的连线没有与之前的线段相交的楼房,带修改 问题求解 看到带修改,显然会想到数据结构来维护,再看到再平面区间加减和区间查询,显然又会想到线段树。 那线段树的每一个节点要维护什么值呢? 看到题面自然会想

luogu P4198 楼房重建

题面传送门 大概可以算线段树单侧递归的板子。 这个东西看上去没法修改 我们考虑合并的时候怎么合并。 我们要维护每个区间的最大值和该区间的长度,那么答案显然是第一个区间的长度。 然后对于每个区间,它的左区间的答案肯定能全部选入,那么考虑右区间。 右区间选入的值肯定不能小于

P4198 楼房重建 |线段树

题目描述 小 A 的楼房外有一大片施工工地,工地上有 \(N\) 栋待建的楼房。每天,这片工地上的房子拆了又建、建了又拆。他经常无聊地看着窗外发呆,数自己能够看到多少栋房子。 为了简化问题,我们考虑这些事件发生在一个二维平面上。小 A 在平面上 (\((0,0)\) 点的位置,第 \(i\) 栋楼房可

题解链接 使用 Ctrl + F 查找

posted on 2019-08-31 11:52:58 P2024 [NOI2001]食物链 加权并查集 P4198 楼房重建 线段树 上帝造题的七分钟2 树状数组(并查集优化) 简化 乘法逆元

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

传送门 分析   被线段树按在地上摩擦  先把左边转化成斜率,那么这个题就转化成每次修改一个点的值,输出前缀最大值的个数   考虑一次询问(l,r,x),表示l前面的数的最大值为x,区间(l,r)内的前缀最大值,那么每次就要输出询问(1,n,0)   用dp式子转移的思想对询问进行拆分   设mid=(l+r

P4198 楼房重建

题面 https://www.luogu.org/problem/P4198 题解 #include<bits/stdc++.h>using namespace std;const int N=1e5+50;int n,m;double a[N];struct node{ double mx; int len;} tt[4*N];void pushup1(int x){ tt[x].mx=max(tt[x<<1].mx,tt[x<<1|1].mx);}int p

[洛谷P4198] 楼房重建

洛谷题目链接:楼房重建 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房。每天,这片工地上的房子拆了又建、建了又拆。他经常无聊地看着窗外发呆,数自己能够看到多少栋房子。 为了简化问题,我们考虑这些事件发生在一个二维平面上。小A在平面上(0,0)点的位置,第i栋楼房可以

【题解】Luogu P4198 楼房重建

原题传送门 根据斜率来建线段树,线段树维护区间最大斜率以及区间内能看见的楼房的数量(不考虑其他地方的原因,两个节点合并时再考虑) 细节见程序 #include <bits/stdc++.h> #define db double #define N 100005 #define getchar nc using namespace std; inline char nc(){ static