线段树-楼房重建-洛谷-P4198

楼房重建

题目大意

小A的楼房外有一大片施工工地,工地上有N栋待建的楼房。每天,这片工地上的房子拆了又建、建了又拆。他经常无聊地看着窗外发呆,数自己能够看到多少栋房子。

为了简化问题,我们考虑这些事件发生在一个二维平面上。小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度。如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线段相交,那么这栋楼房就被认为是可见的。

施工队的建造总共进行了M天。初始时,所有楼房都还没有开始建造,它们的高度均为0。在第i天,建筑队将会将横坐标为Xi的房屋的高度变为Yi(高度可以比原来大—修建,也可以比原来小—拆除,甚至可以保持不变—建筑队这天什么事也没做)。请你帮小A数数每天在建筑队完工之后,他能看到多少栋楼房?

题目解答

给每个楼房表示成从原点到其的斜率,我们要求的就是从原点开始,斜率严格增大的序列长度.

用线段树维护.

维护区间[l,r][l,r][l,r]中以a[l]a[l]a[l]开始的递增序列的长度.

合并的时候,判断[l,mid][l,mid][l,mid]的最大值与a[mid+1]a[mid+1]a[mid+1]之间的关系.

如果max(a[l,mid])&lt;a[mid+1]max(a[l,mid]) &lt; a[mid+1]max(a[l,mid])<a[mid+1],则seg[o]=seg[lch]+seg[rch]seg[o] = seg[lch] + seg[rch]seg[o]=seg[lch]+seg[rch]

否的话,需要在[mid+1,r][mid+1,r][mid+1,r]中寻找递增序列的第一个数&gt;max(a[l,mid])&gt;max(a[l,mid])>max(a[l,mid])的递增序列的长度,用find(rch,mid+1,r,max(a[l,mid]))find(rch,mid+1,r,max(a[l,mid]))find(rch,mid+1,r,max(a[l,mid]))表示,那么合并就是
seg[o]=seg[lch]+find(rch,mid+1,r,max(a[l,mid]))seg[o] = seg[lch] + find(rch,mid+1,r,max(a[l,mid]))seg[o]=seg[lch]+find(rch,mid+1,r,max(a[l,mid]))

下面我们需要实现findfindfind操作

边界判断,如果findfindfind的区间长度为111,那么直接判断范围即可.

我们需要对传给find(o,l,r,mx)find(o,l,r,mx)find(o,l,r,mx)的区间[l,r][l,r][l,r]再分一次,递归查找.

如果mx≤max(a[l,r])mx \le max(a[l,r])mxmax(a[l,r]) ,那么res=seg[o]−seg[o.lch]+find(o.lch,l,mid,x)res = seg[o] - seg[o.lch] + find(o.lch,l,mid,x)res=seg[o]seg[o.lch]+find(o.lch,l,mid,x)
如果mx&gt;max(a[l,r])mx &gt; max(a[l,r])mx>max(a[l,r]) ,那么res=find(o.rch,mid+1,r,x)res = find(o.rch,mid+1,r,x)res=find(o.rch,mid+1,r,x)
因为segsegseg是从下网上合并的,所以传给findfindfindseg[o]seg[o]seg[o]是计算好了的,所以可以直接使用.

时间复杂度是O(nlognlogn)O(nlognlogn)O(nlognlogn)

代码

#include <iostream>const int N = 100007;
int n,m;double T[N<<2],M[N<<2];inline int find(int o,int l,int r,double v) {if(l == r) return v < M[o];int mid = (l + r) >> 1;if(v < M[o<<1]) return find(o<<1,l,mid,v) + T[o] - T[o<<1];else return find(o<<1|1,mid+1,r,v);
}
inline void maintain(int o,int l,int r) {M[o] = std::max(M[o<<1],M[o<<1|1]);int mid = (l + r) >> 1;T[o] = T[o<<1] + find(o<<1|1,mid+1,r,M[o<<1]);}
inline void change(int o,int l,int r,int pos,double val) {if(l == r) {M[o] = val;T[o] = 1;return ;}int mid = (l + r) >> 1;if(pos <= mid) change(o<<1,l,mid,pos,val);else change(o<<1|1,mid+1,r,pos,val);maintain(o,l,r);
}
inline void build(int o,int l,int r) {if(l == r) {M[o] = 0;T[o] = 1;return ;	}int mid = (l + r) >> 1;build(o<<1,l,mid);build(o<<1|1,mid+1,r);
}int main() {std::ios::sync_with_stdio(false);std::cin >> n >> m;build(1,1,n);while(m--) {int pos;double val;std::cin >> pos >> val;change(1,1,n,pos,val/pos);std::cout << find(1,1,n,0.) << std::endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P6835-[Cnoi2020]线形生物【期望dp】

正题 题目链接:https://www.luogu.com.cn/problem/P6835?contestId34123 题目大意 n1n1n1个点&#xff0c;其中每个iii向i1i1i1连边(i≤n)(i\leq n)(i≤n)&#xff0c;然后有mmm对(u,v)(u,v)(u,v)表示uuu向vvv连边u≥vu\geq vu≥v。开始在点111&#xff0c;每次随机走一个相连…

【DP】游戏

游戏 题目大意&#xff1a; 有一个图&#xff0c;第s秒在点p会出现c个怪物&#xff08;过了这一秒就会消失&#xff09;&#xff0c;小明可以从任意一个点出发&#xff08;从第一秒开始&#xff09;&#xff0c;有m条路径&#xff08;无向&#xff09;&#xff0c;链接着两个…

定时调度系列之Quartz.Net详解

一. 背景我们在日常开发中&#xff0c;可能你会遇到这样的需求&#xff1a;"每个月的3号给用户发信息&#xff0c;提醒用户XXX "、"每天的0点需要统计前一天的考勤记录"、"每个月的1号计算上个月的库存情况"、"定时初始化数据供其它业务使用…

CF1419E-Decryption【数论,dfs】

正题 题目链接:https://www.luogu.com.cn/problem/CF1419E 题目大意 nnn的所有约数排成一个圈&#xff0c;求一个顺序使得相邻的互质的数最少。 解题思路 质因数分解后&#xff0c;我们考虑每个质因数之间填什么。对于两个质因数a,ba,ba,b。显然a∗ba*ba∗b也是nnn的约数&…

P4445 最长回文串

P4445 最长回文串 题目描述 顺序和逆序读起来完全一样的串叫做回文串。比如acbcaacbcaacbca是回文串&#xff0c;而abcabcabc不是&#xff08;abc的顺序为abcabcabc&#xff0c;逆序为cbacbacba&#xff0c;不相同&#xff09;。 输入长度为nnn的串SSS&#xff0c;求SSS的最…

RyuJIT的华丽转身

RyuJIT是作为.NET即时编译器的代号称谓&#xff0c;它是.NET运行时的基本组件之一。与此相反的是&#xff0c;Roslyn作为C#编译器&#xff0c;其编译C#代码成为IL字节码。然后&#xff0c;其再将IL字节码编译成相对于多种处理器的机器码。随着最近对dotnet/coreclr #18064的合并…

【树状数组】【dfs】树

树 题目大意&#xff1a; 有一棵树&#xff0c;当给一个点加上一个val时&#xff0c;他的儿子会减val&#xff0c;而他儿子的儿子会加上val&#xff08;-&#xff08;-val&#xff09;val&#xff09;&#xff0c;有m条指令&#xff0c;要不输出某个点的值&#xff0c;要不给…

SP1811-Longest Common Substring【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/SP1811 题目大意 求两个串的最长公共子串。 解题思路 对与第一个串首先构建一个SAMSAMSAM&#xff0c;然后考虑让第二个串在上面匹配。 对于枚举的每个位置要在SAMSAMSAM上找一个节点使得它的后缀是枚举到的位置的后缀。所…

使用Nexus搭建私有Nuget仓库

前言Nuget是ASP .NET Gallery的一员&#xff0c;是免费、开源的包管理工具&#xff0c;专注于在.Net / .Net Core应用开发过程中第三方组件库的管理&#xff0c;相对于传统单纯的dll引用要方便、科学得多。其中nuget.org是最著名的Nuget公开库&#xff0c;但是企业内部开发的&a…

Wannafly挑战赛26 题解

Wannafly挑战赛26 题目连接 https://www.nowcoder.com/acm/contest/212#question A. 御坂网络 枚举圆心所在的位置,O(n)O(n)O(n) 检查即可,总时间复杂度为O(n2)O(n^2)O(n2) B. 冥土追魂 这题比较坑,我感觉题意叙述有问题,总之也是一道水题,题解略去. C. 七彩线段 题解 …

初一模拟赛总结(3.16)

成绩&#xff1a; rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf210210210303030100100100000808080222hkyhkyhky190190190100100100000101010808080333fyfyfy120120120100100100000202020000444tjhtjhtjh100100100100100100000000000555wjjwj…

牛客挑战赛43C-最优公式【二分】

正题 题目链接:https://ac.nowcoder.com/acm/contest/7413/C 题目大意 给一个序列AAA&#xff0c;求两个a,ba,ba,b使得∑i1n∑j1nmax{∣Ai−a∣,∣Aj−b∣}\sum_{i1}^n\sum_{j1}^nmax\{|A_i-a|,|A_j-b|\}i1∑n​j1∑n​max{∣Ai​−a∣,∣Aj​−b∣}最小。 解题思路 因为是取…

好代码是管出来的——Git的分支工作流与Pull Request

上一篇文章好代码是管出来的——使用Git来管理源代码 介绍了常用的版本控制工具以及git的基本用法&#xff0c;从基本用法来看git与其它的版本控制工具好像区别不大&#xff0c;都是对代码新增、提交进行管理&#xff0c;可以查看提交历史、代码差异等功能。但实际上git有一个重…

牛客练习赛29 题解

牛客练习赛29 A. 可持久化动态图上树状数组维护01背包 题解 这题跟标题没有任何关系… 贪心的使得负数删除的时候下标尽可能大,然后正数的时候下标尽可能小. 观察到每个数下标最大的时候就是它的初始下标,下标的最小值是1. 然后贪心一下就好了. 代码 #include <iost…

【Floyed】小萨的烦恼(ssl 1624)

小萨的烦恼 ssl 1624 题目大意&#xff1a; 一个无向图&#xff0c;可以使其中一条道路的值除以2&#xff0c;求两个点之间的最短路 原题&#xff1a; Description 圣诞节又要到了&#xff01;小萨希望和自己心仪的MM一起出去度过一个浪漫的的圣诞节。他进行了详尽的准备…

好代码是管出来的——使用GitHub

前面的文章介绍了Git的基本概念和用法&#xff0c;本文则是基于GitHub的一个实践介绍&#xff0c;主要内容有&#xff1a;GitHub简介个人与组织仓库的创建与维护Fork与pull request小结GitHub简介GitHub是一个Git的远程代码托管平台&#xff0c;它除了提供代码托管外&#xff0…

Wannafly挑战赛24

Wannafly挑战赛24 题目连接 https://www.nowcoder.com/acm/contest/186#question A.石子游戏 题解 注意到当石子个数为偶数的时候,每回合都会减少一堆偶数石子,因此,先手必胜. 我们可以不考虑奇数堆石子,因为必胜方始终可以动偶数堆. 当必败方将奇数堆分成一堆偶数和一堆…

【模拟】正方形

正方形 题目大意&#xff1a; 有三个人&#xff0c;一人一笔的画正方形&#xff0c;每个正方形是上一个正方形每条边上的中点连接而成的&#xff0c;求每个人画了多长 原题&#xff1a; 题目描述 又到暑假啦&#xff0c;Conan, Ayumi, Mitsuhiko, Genta一起到Hakase家愉快…

P3975-[TJOI2015]弦论【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/P3975 题目大意 给一个字符串sss和t,kt,kt,k。求字符串sss第kkk大的子串。 当T0T0T0时&#xff0c;相同的子串算一个当T1T1T1时&#xff0c;不同位置的相同子串算不同的串 解题思路 当T0T0T0时很简单&#xff0c;对于每个位…

【DP】跳格子

跳格子 题目大意&#xff1a; 有一堆格子&#xff0c;可以往前跳不超过当前格子上的数的步数&#xff0c;从1跳到最后一格最少要跳多少 原题&#xff1a; 题目描述 大家都说要劳逸结合&#xff0c;Ayumi, Mitsuhiko, Genta画完方格就出去运动啦&#xff01; 他们来到了一片…