首页 > 其他分享 >checkmin 线段树

checkmin 线段树

时间:2023-08-18 18:22:08浏览次数:31  
标签:势能 log max 线段 checkmin 区间 Theta

题意:

给你一个长为 \(n\) 的序列 \(a\),支持:

  • 1 l r x:\(\forall a_i \in [l,r],a_i \gets \min(a_i,x)\)。
  • 2 l r:求 \(\sum_{i\in [l,r]} a_i\)。
  • 3 l r:求 \(\max_{i \in [l,r]} a_i\)。

数据范围:\(n,m \le 10^5\)。

思路:

考虑线段树,显然一个结点需要维护的基本信息为 \(sum\) 和 \(max\)。

考虑 \(\operatorname{checkmin}\) 操作对于一个被其完全覆盖的区间 \([L,R]\) 的影响。

(因为使用了线段树,所以不被完全覆盖的区间直接使用 \(\operatorname{pushup}\) 进行更新,并且这些区间只有 \(\Theta(\log n)\) 个)

发现这个操作会使得 \([L,R]\) 中的数趋于相同。

具体来说,令 \(max\) 为最大值,\(sec\) 为严格次大值。

考虑如下情况:

  1. 如果 \(x \ge max\),对区间不会有影响。
  2. 如果 \(max > x > sec\),只需要修改最大值,区间信息可以容易地更新,然后打上一个修改最大值的标记即可。
  3. 如果 \(sec \ge x\),发现修改后这个区间中的不同数的个数至少减少一个,考虑暴力递归到下一层。

令一个区间的势能为其中的不同数的个数。

显然每次操作只有被部分修改的区间势能可能加 \(1\),因此势能总增量为 \(\Theta(m \log n)\),因此势能总减量为 \(\Theta((n+m)\log n)\)。

显然每次递归必然以为着该区间势能减少,因此递归总次数不会超过势能总减量。

因此总时间复杂度:\(\Theta(n \log n)\)。

标签:势能,log,max,线段,checkmin,区间,Theta
From: https://www.cnblogs.com/zzzYheng/p/17641256.html

相关文章

  • dfs序线段树
    dfs序线段树1.树上操作思路遍历一整棵树,记录一下节点\(u\)的所对应的子树的节点数\(siz_u\)以及\(dfs\)序\(dfn_u\)根据整棵树的\(dfs\)序,我们可以把树变成了一个序列再维护线段树,\(\text{update(l,r,x)}\)表示将\([\text{l,r}]\)上值加上\(x\).\(\text{query(......
  • 杭电23多校第九场Capoo on tree(二分+树链剖分+可持久化线段树)
    2023HDU多校9__Capooontree(二分+树链剖分+可持久化线段树)题目链接Solution\(Hint1\)考虑如何进行对某一相同点权的所有点进行点权\(+1\)操作,如果我们建立权值线段树,那只需要将权值为\(x\)的点并入权值\(x+1\)即可,但是这样就算我们建立以节点编号为版本的可持久化线段树,也是......
  • 线段树&树状数组
    P4246首先注意到两个点应该怎么联通,有可能直接走进去对吧,也有可能是绕一圈走过去,我们考虑整个在求连通性的时候最重要的是哪些点,是左上角,左下角,右上角和右下角,所以我们考虑维护他们之间的连通性。然后连通性很好合并,所以我我们可以把这个东西搬上线段树维护一大段区间的四个角互......
  • 线段树
    线段树\(1.0\)线段树\(1.0\)可以实现对区间内的数加减,查询区间和的操作。例题【模板】线段树1原理定义l,r:分别表示节点表示的区间的左端点与右端点。sum:节点表示的区间\([l,r]\)内数组元素之和。add:lazy标记,表示这个节点以下的所有子节点中的叶子表示的数......
  • 线段树进阶-分裂合并
    前置知识动态开点权值线段树相信各位都会线段树合并我们考虑对于两棵权值线段树,由于动态开点的缘故,这两棵树都是不满的我们考虑能不能把这两棵树所保存的信息合并在一起我们考虑这么一件事就是说,由于树不满,我们可以暴力扫分为三种情况(设把\(b\)所在树并到\(a\)内,\(a\)......
  • POJ 2828(线段树 单点更新)
    BuyTicketsTimeLimit: 4000MS MemoryLimit: 65536KTotalSubmissions: 16466 Accepted: 8201DescriptionRailwayticketsweredifficulttobuyaroundtheLunarNewYearinChina,sowemustgetupearlyandjoinalongqueue…TheLunarNewYearwasap......
  • ZOJ 3911 线段树(区间更新)
    PrimeQueryTimeLimit: 1Second     MemoryLimit: 196608KBYouaregivenasimpletask.Givenasequence A[i] with NHerearetheoperations:Avl,addthevalue v toelementwithindex l.(1<=V<=1000)Ralr,replacealltheelementsofse......
  • HDU 4893(线段树区间更新)
    Wow!SuchSequence!TimeLimit:10000/5000MS(Java/Others)    MemoryLimit:65536/65536K(Java/Others)TotalSubmission(s):3856    AcceptedSubmission(s):1085ProblemDescriptionRecently,Dogegotafunnybirthdaypresentfromhisnewf......
  • HDU 1698(线段树 区间更新)
    JustaHookTimeLimit:4000/2000MS(Java/Others)    MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):23481    AcceptedSubmission(s):11758ProblemDescriptionInthegameofDotA,Pudge’smeathookisactuallythemosthorr......
  • [蓝桥杯 2021 省 B] 双向排序 (线段树)
    调了整整5个小时,结果发现自己建树的方式有误,气死我了气死我了,比较好的一道线段树(虽然我不会-----#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+10;intn,m,res,point;vector<int>v[2];//用于存储结果的数组,下标0表示sum为0,下标1表示sum为1structno......