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

luogu 楼房重建

  • problem
  • solution
  • code

problem

洛谷链接

solution

非常巧妙的一道题,对线段树的运用很灵活。

显然这个与原点的连线可以想到将每个点转化为与原点连线形成的直线斜率。

答案其实就是:从第一个点开始选,后一个斜率比前面大的必须选,否则,即小于等于则必须不选的选择个数。

区间是固定的,且左边的一些信息影响右边,每次还要单点修改,可以联想到线段树。

这个线段树没有懒标记,自然也没有下放标记操作。唯一的难点就是在于合并操作的实现。

线段树区间 [l,r][l,r][l,r] 维护从 lll 开始选,按照答案的规则选出的个数答案。

最终输出线段树节点 111 表示 [1,n][1,n][1,n] 区间的答案即可。

显然,一段区间的第一个一定被选,一段区间中的最大值也一定被选。

而一段区间的最大值会影响后面区间的可选值,所以还要维护一个区间 [l,r][l,r][l,r] 中最大的斜率。

考虑左右儿子具体怎么合并给父亲。

首先,左儿子合并上去后做的是开头部分,所以左儿子的答案一定贡献。

其次,左儿子一定会选其区间内的斜率最大值,而右儿子的斜率都必须大于这个最大值。

这里,我们采取递归实现合并方式,pushup(now,l,r,k) 表示要求线段树 nownownow 节点代表的区间 [l,r][l,r][l,r] 选择的斜率必须大于 kkk 的答案。

一开始是要求右儿子选择整体要大于左儿子的斜率最大值的。

t[now].ans = t[lson].ans + pushup( rson, mid + 1, r, t[lson].Max );

然后开始递归考虑右儿子的子树,即具体的 pushup 实现。

  • 如果节点内的最大值都不超过要求的斜率,直接返回。

    if( t[now].Max <= k ) return 0;
    
  • 如果左区间的最大值都不超过要求的斜率,那么直接找右区间即可。

    if( t[lson].Max <= k ) return pushup( rson, mid + 1, r, k );
    
  • 否则,就要去找左区间的答案。左区间既然有些要被选,那么就没有影响右区间的开始,直接统计右区间的答案。

    而右区间的答案不是 t[rson].ans 而是 t[now].ans-t[lson].ans

    因为右区间可能有些会被左区间挡住不能选,就只能换一种方法表示了。

    return pushup( lson, l, mid, k ) + t[now].ans - t[lson].ans;
    
  • 走到叶子节点,就直接判断是否大于要求的斜率即可。

    if( l == r ) return t[now].Max > k;
    
  • trick

    可以记录一下横坐标为 lll 的点与原点形成直线的斜率。

    如果这个斜率就一定大于要求值的话,那么就相当于从 lll 开始按照规则选的个数。

    即线段树上 [l,r][l,r][l,r] 区间维护的信息,那么直接返回就不用再往下操作了。

    if( g[l] > k ) return t[now].ans;
    

code

#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
struct node { double Max; int ans; }t[maxn << 2];
double g[maxn];#define lson now << 1
#define rson now << 1 | 1
#define mid ( ( l + r ) >> 1 )int pushup( int now, int l, int r, double k ) {if( t[now].Max <= k ) return 0;if( k < g[l] ) return t[now].ans;if( l == r ) return t[now].Max > k;if( t[lson].Max <= k ) return pushup( rson, mid + 1, r, k );else return pushup( lson, l, mid, k ) + t[now].ans - t[lson].ans;
}void modify( int now, int l, int r, int x, int y ) {if( l == r ) { t[now].Max = 1.0 * y / x, t[now].ans = 1; return; }if( x <= mid ) modify( lson, l, mid, x, y );else modify( rson, mid + 1, r, x, y );t[now].Max = max( t[lson].Max, t[rson].Max );t[now].ans = t[lson].ans + pushup( rson, mid + 1, r, t[lson].Max );
}int main() {int n, m, x, y;scanf( "%d %d", &n, &m );while( m -- ) {scanf( "%d %d", &x, &y );g[x] = 1.0 * y / x;modify( 1, 1, n, x, y );printf( "%d\n", t[1].ans );}
}

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

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

相关文章

模板:P6114 【模板】Lyndon 分解Runs(字符串)

你不会连跑步都不会吧。 &#xff08;逃 前言 SAM&#xff1a;runs&#xff1f;那我run了。 比 SAM 看起来层次更高的奥妙算法。 理论证明比较复杂&#xff0c;但板子写起来都比较简单。 本文会略过很多的证明。 Lyndon 分解 Definition&#xff1a; 如果一个串本身比它的所…

ASP.NET Core 3.0预览版体验

目前.NET Core 3.0的版本为.NET Core 3.0 Preview 3&#xff0c;对应ASP.NET Core 3.0 Preview 3。ASP.NET Core 3.0 之后将不再支持.NET Framework&#xff0c;只运行在.NET Core 上面。ASP.NET Core 3.0 现在已经出到了第三个预览版&#xff0c;增加和改进了很多功能。环境准…

【无码专区13】最小公倍数(线段树)

因为只有std&#xff0c;没有自我实现&#xff0c;所以是无码专区 主要是为了训练思维能力 my idea顾名思义&#xff0c;记录了我的整个思维过程&#xff0c;以及自己部分实现细节口胡&#xff0c;还有期望分数 solution才是dls正解&#xff0c;但是因为只有潦草几句&#x…

2021牛客暑期多校训练营2

2021牛客暑期多校训练营2 题号题目知识点AArithmetic ProgressionBCannonCDraw GridsDEr Ba GameEGas StationFGirlfriendGLeague of LegendsHOlefinIPenguinsbfsJProduct of GCDsKStackLWeChat Walk

P6772 [NOI2020] 美食家(矩阵快速幂)

前言 无能狂怒。 见过甚至写过博客的trick&#xff0c;但就是想不起来了。 解析 做法1 设 ft,xf_{t,x}ft,x​ 表示 t 时刻在 x 的最大价值。 直接转移即可&#xff0c;时间复杂度 O(T(nm))O(T(nm))O(T(nm))&#xff0c;期望得分 40 分。 结合无脑转圈的 A 性质&#xff0c;…

C# .net 中 Timeout 的处理及遇到的问题

C# 中 Timeout 的处理前言最近在项目中要实现一个功能&#xff0c;是关于 Timeout 的&#xff0c;主要是要在要在 TCP 连接建立的时间 和 整个请求完成的时间&#xff0c;在这两个时间层面上&#xff0c;如果超出了设置的时间&#xff0c;就抛出异常&#xff0c;程序中断。研究…

[CodeJam 2019 Round 3] Rancake Pyramid(笛卡尔树)

CodeJam 2019 Round 3 Rancake Pyramidproblemsolutioncodeproblem 神奈子是个很爱打麻将的老婆婆&#xff0c;有一天她把她的麻将放成了 nnn 堆&#xff0c;第 iii 堆的高度为 aia_iai​ 。 因为她很喜欢风&#xff0c;所以她用风吹倒了最左边的 LLL 堆麻将和最右边的 RRR 堆…

Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2)

Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 Div. 2) 题号题目知识点ADigits Sum签到BReverse String思维CPenalty思维DBackspace逆向思维EPermutation Shift置换群FPairwise ModuloGCommon Divisor GraphHXOR and DistanceIStairs cf15…

模板:全局平衡二叉树

所谓全局平衡二叉树&#xff0c;就是在全局来看都很平衡的二叉树。 &#xff08;逃 前言 这个引言倒是实话&#xff08;雾 可以把一些本来只能用树剖两个 log 做的问题在单log 时间复杂度解决。 修改通常来说只能支持单点修改。 查询解决链上问题或者全局问题更为方便&#x…

[CodeJam 2021 Round 3] Square Free(调整法 / 字典序最小解网络流)

CodeJam 2021 Round3 Square Freeproblemsolutioncodecode-stdproblem 神奈子是个很爱打麻将的老婆婆&#xff0c;有一天她把她的麻将放进了一个 nmn\times mnm 的网格图里&#xff0c;每个麻将可以左斜着放入网格中&#xff08;如 / &#xff09;&#xff0c;也可以右斜着&am…

P6773 [NOI2020] 命运(dp、线段树合并)

前言 一道看起来很毒瘤但其实还算小清新的题&#xff1f; 理解后感觉其实并没有那么难。 暴力分非常足&#xff0c;好评。 奇妙的线段树合并技巧增加了。 解析 解法1 你是怎么手玩的样例一&#xff1f; 大部分&#xff08;比如我&#xff09;都是容斥吧。 把手玩的方法搬到…

ConsurrentDictionary并发字典知多少?

在上一篇文章你真的了解字典吗?一文中我介绍了Hash Function和字典的工作的基本原理.有网友在文章底部评论,说我的Remove和Add方法没有考虑线程安全问题.https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2?redirectedfromMSDN&viewn…

[luogu 4292][bzoj 1758][WC2010] 重建计划(点分治 + dp + 单调队列优化 + 启发式合并)

[WC2010]重建计划problemsolutioncodeproblem 洛谷指路 solution 一看那个道路平均价值的式子&#xff1a;AvgValue∑e∈Sv(e)∣S∣\text{AvgValue}\frac{\sum_{e\in S}v(e)}{|S|}AvgValue∣S∣∑e∈S​v(e)​ 就是 0/1分数规划 的样子。 所以考虑二分最终的答案 midmidmid…

cf1553C. Penalty

cf1553C. Penalty 题意&#xff1a; 有十轮点球&#xff0c;两个队伍轮流进行&#xff0c;1表示进&#xff0c;0表示不进&#xff0c;&#xff1f;表示未知&#xff0c;如果比赛没有了悬念将直接结束。现在让你预测一个情况&#xff0c;使得进行的轮数最少。裁判在决定停止点…

ASP.NET Core 基于JWT的认证(二)

上一节我们对 Jwt 的一些基础知识进行了一个简单的介绍&#xff0c;这一节我们将详细的讲解,本次我们将详细的介绍一下 Jwt在 .Net Core 上的实际运用。.Net Core 2.2Visual Studio 2017ASP.NET Core WebAPI2在上一篇文章中&#xff0c;我们详细的介绍了JWT的知识&#xff0c;这…

P6774 [NOI2020] 时代的眼泪(分块)

前言 看到题目名&#xff1a;别骂了别骂了。 一道很中规中矩的YNOI吧。 卡在整块对整块的贡献上了。 这也确实算是本题最不好做的部分了。 前置知识&#xff1a;Yuno loves sqrt technology I 解析 区间逆序对加强版&#xff1f;很难不想到两道 YLST。 然而多了两维限制&a…

[NOIP2021] 数列(计数dp)

solution f[i][j][k][num][p]:2pf[i][j][k][num][p]:2^pf[i][j][k][num][p]:2p 选择了 iii 个&#xff0c;前 p−1p-1p−1 位 (202p−1)(2^0~2^{p-1})(20 2p−1) 已经选了jjj个&#xff0c;低位向高位进位上来 kkk&#xff0c;前 ppp 位已经确定有 numnumnum 个位置为 111&…

Xor sum HDU - 6955

Xor sum HDU - 6955 题意&#xff1a; 给定一个长度为n的整数序列&#xff0c;求其XOR和不小于k的最短连续子序列。 如果有多个相同长度的连续子序列&#xff0c;则打印具有最小左端点的连续子序列。 如果没有连续的子序列开关XOR总和不小于k&#xff0c;只需打印“-1”。 …

模板:子序列自动机(字符串)

所谓子序列自动机&#xff0c;就是根据子序列建立的自动机。 &#xff08;逃&#xff09; 前言 小清新算法。 解析 和其他自动机类似的&#xff0c;我们希望子序列自动机能且只能接受原串的所有子序列。 考虑一个问题&#xff1a;给你一个串 T&#xff0c;如何判断它是否是…

Docker最全教程之Go实战,墙裂推荐(十九)

前言与其他语言相比&#xff0c;Go非常值得推荐和学习&#xff0c;真香&#xff01;为什么&#xff1f;主要是可以直接编译成机器代码&#xff08;性能优越&#xff0c;体积非常小&#xff0c;可达10来M&#xff0c;见实践教程图片&#xff09;而且设计良好&#xff0c;上手门槛…