首页 > TAG信息列表 > 楼房
洛谷 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\) 的个数。考虑线段树维护。 线段树上每个结点维护当前区间 \([lP4198 楼房重建 题解
一道线段树题目,思路很巧妙。 首先先转化一下题意,发现如果后面的楼房能够被前面的挡住,一定是后面楼房的斜率比前面楼房小,斜率就是 \(\dfrac{H_i}{i}\),于是这道题变成了单点修改,全局查询哪几个点斜率是前缀最大值中的最大值。 维护两个值 \(ans,Maxn\) 分别表示只存在这个区间时的答1017. 怪盗基德的滑翔翼
题目传送门 一、题目分析 二、题目总结 (1)由于中途不能修改方向,所以,我们可以考虑从最左端点、最右端点出发即可,这样肯定是比在中间出发要占便宜(贪心?)。 (2)从左到右,求一遍最长上升子序列\(LIS\)问题。 (3) 从右到左,再求一遍最长上升子序列\(LIS\)问题。 (4) 两次结果取最大值即可。P4198 楼房重建 题解
Description Luogu传送门 Solution 不难想到用斜率来计算能看到多少栋楼房,由于哪些楼房能看到哪些不能被看到是固定的,所以不是单调队列优化\(dp\)什么的。 暴力做法是 \(O(n^2)\) 的,我们考虑用线段树来维护。 线段树里记录两个值,\(len\) 和 \(maxs\)。 \(len\):表示当前区间能看lgP4198 楼房重建
好菜啊,大原题都没做过 题意转换,相当于是 每次 单点修改后 求\(p[i] / i\)的单调递增子序列的最长长度 之后就不是很会了。。。。 参阅题解之后,相当于是 把\(push\_up\)的操作变复杂一点 加强它 然后就可以很快的实现单点修改 + 固定一个端点的 单调递增子序列的最大长度 代码P4198 楼房重建 题解
题目大意 P4198 楼房重建 在一个平面内,求出所有的高度大于00的点与(0,0)(0,0)的连线没有与之前的线段相交的楼房,带修改 问题求解 看到带修改,显然会想到数据结构来维护,再看到再平面区间加减和区间查询,显然又会想到线段树。 那线段树的每一个节点要维护什么值呢? 看到题面自然会想【BZOJ 2957】楼房重建:线段树 + 单调栈
题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房。每天,这片工地上的房子拆了又建、建了又拆。他经常无聊地看着窗外发呆,数自己能够看到多少栋房子。 为了简化问题,我们考虑这些事件发生在一个二维平面上。小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和luogu P4198 楼房重建
题面传送门 大概可以算线段树单侧递归的板子。 这个东西看上去没法修改 我们考虑合并的时候怎么合并。 我们要维护每个区间的最大值和该区间的长度,那么答案显然是第一个区间的长度。 然后对于每个区间,它的左区间的答案肯定能全部选入,那么考虑右区间。 右区间选入的值肯定不能小于梦:楼房,喧嚣,滑板,主席,关切,三伯,钓鱼
时间:2020年7月20日 早上5:00 睡眠质量:差 梦境: 我来到一个像有4-5层高的楼房,像以前那种学校的楼房,开始我像是在里面找我的猫,于是我抱起了我那只猫,往自己的租房走去。我好像也发现了这其实并不是我的猫,只是长得很像而已,但是我好像也没有太过于在乎。 可能因为不是P4198 楼房重建 |线段树
题目描述 小 A 的楼房外有一大片施工工地,工地上有 \(N\) 栋待建的楼房。每天,这片工地上的房子拆了又建、建了又拆。他经常无聊地看着窗外发呆,数自己能够看到多少栋房子。 为了简化问题,我们考虑这些事件发生在一个二维平面上。小 A 在平面上 (\((0,0)\) 点的位置,第 \(i\) 栋楼房可【BZOJ2957】楼房重建(线段树)
点此看题面 大致题意: 有\(n\)个楼房,第\(i\)个楼房可以表示为连结\((i,0)\)和\((i,H_i)\)的线段,且第\(i\)个楼房可以被看见当且仅当连结\((0,0)\)和\((i,H_i)\)的线段与表示其他楼房的线段无交点。每次单点修改\(H_i\),求每次修改后能看到几个楼房。 前言 \(Jan\ 29th\)刷题计划(6/6),(分块)楼房重建 HYSBZ - 2957
题意 长度为n的坐标轴上,从1-n上的每一点都有一栋楼房,楼房的初识高度都为0,每一天都有一栋楼房的高度被修改(也可以不变),一栋楼房能被看见当且仅当其最高点与远点的连线不会与其他之前连线相交,问你每天能看见的楼房数是多少。 思路 其实这道题也可以用线段树做,但是感觉更复杂。预处理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楼房重建
不错的一道题。 题意:每次修改一栋楼,求这些楼顶跟原点$(0,0)$的斜率单调上升长度(不是$\text{LIS}$)。 因为一个楼房能被看到可以等价于它的斜率比之前的任何一个都大。 这道题实际上满足区间合并,但是比较麻烦。 重点就在$\text{pushup}$的写法。 首先定义线段树中区间的解即为该对应[洛谷P4198] 楼房重建
洛谷题目链接:楼房重建 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房。每天,这片工地上的房子拆了又建、建了又拆。他经常无聊地看着窗外发呆,数自己能够看到多少栋房子。 为了简化问题,我们考虑这些事件发生在一个二维平面上。小A在平面上(0,0)点的位置,第i栋楼房可以G - 楼房重建 (线段树)
题目链接:https://cn.vjudge.net/contest/281960#problem/G 题目大意:中文问题 具体思路:首先每一个点的值可以用当前这个点的斜率来表示,每一次输入一个值,我们先看当前这个点之前的区域中有多少点是小于当前这个点的斜率的,这样每一次查询就可以了。 查询的时候:首先对于当前的点的左区P1382 楼房
传送门 在同一横坐标,轮廓只会被最高的楼房影响 所以考虑用 $multiset$ 维护当前的每个楼房高度 轮廓线显然只有出现楼房最高高度变化时会出现转折点 把一个楼根据左右边界分成两个东西,左边时把高度加入 $set$,到了右边再从 $set$ 里把该高度删除 每次更新 $set$ 时判断一下高度变化