当前位置: 首页 > news >正文

LGP3372 [LG TPLT] 线段树一 学习笔记

LGP3372 [LG TPLT] 线段树·一 学习笔记

\(\texttt{Luogu Link}\)

题意简述

给你一个序列。

做法解析一

线段树。

维护若干个区间的信息,满足可以用 \(O(\log n)\) 个区间的信息拼起来整个区间的信息。所以它非常巧妙。还有巧妙的传 tag 机制。对,应该是。

我也不知道这里有必要写什么。先空着吧。

来都来了,测一下自己敲最基础的线段树的耗时。

代码实现一

好吧,我居然忘了区间加线段树在 maketag 的时候,sum[u]+=tag[u]*clen[u] 这个地方是有个 clen[u] 的系数的!见鬼。

#include <bits/stdc++.h>
using namespace std;
using namespace obasic;
const int MaxN=1e5+5;
int N,M,Opt,X,Y;lolo A[MaxN],Z;
struct SegTree{int cl[MaxN<<2],cr[MaxN<<2],cmid[MaxN<<2];lolo sum[MaxN<<2],tag[MaxN<<2];int ls(int u){return u<<1;}int rs(int u){return (u<<1)|1;}void pushup(int u){sum[u]=sum[ls(u)]+sum[rs(u)];}void build(int u,int l,int r){cl[u]=l,cr[u]=r;if(l==r){sum[u]=A[l];return;}int mid=(l+r)>>1;cmid[u]=mid;build(ls(u),l,mid),build(rs(u),mid+1,r),pushup(u);}void maketag(int u,lolo x){sum[u]+=(cr[u]-cl[u]+1)*x,tag[u]+=x;}void pushdown(int u){if(tag[u])maketag(ls(u),tag[u]),maketag(rs(u),tag[u]),tag[u]=0;}void modify(int u,int dl,int dr,lolo x){if(dl<=cl[u]&&cr[u]<=dr){maketag(u,x);return;}pushdown(u);if(dl<=cmid[u])modify(ls(u),dl,dr,x);if(dr>cmid[u])modify(rs(u),dl,dr,x);pushup(u);}lolo getsum(int u,int dl,int dr){if(dl<=cl[u]&&cr[u]<=dr)return sum[u];pushdown(u);lolo res=0;if(dl<=cmid[u])res+=getsum(ls(u),dl,dr);if(dr>cmid[u])res+=getsum(rs(u),dl,dr);return res;}
}SgT;
int main(){readis(N,M);for(int i=1;i<=N;i++)readi(A[i]);SgT.build(1,1,N);for(int i=1;i<=M;i++){readis(Opt,X,Y);if(Opt==1)readi(Z),SgT.modify(1,X,Y,Z);if(Opt==2)writil(SgT.getsum(1,X,Y));}return 0;
}

做法解析二

区间加区间修树状数组。

首先,修改或查询 \([l,r]\) 都差分成 \([1,r]\)\([1,l)\) 解决。

考虑求出原数组的差分数组 \(B\)。区间修改在差分数组上表现为两个单点改;对于区间查询显然有:\(\sum_{i=1}^p a_i=\sum_{i=1}^p (p+1-i)\times b_i=(p+1) \sum_{i=1}^p b_i-\sum_{i=1}^p i\times b_i\)。所以我们维护 \(\sum_{i=1}^p b_i\)\(\sum_{i=1}^p i\times b_i\)

代码实现二

#include <bits/stdc++.h>
using namespace std;
using namespace obasic;
const int MaxN=1e5+5;
int N,M,Opt;lolo X,Y,Z;
struct BinidTree{int n;lolo ta[MaxN],ts[MaxN];void init(int x){n=x;fill(ta,ta+n+1,0),fill(ts,ts+n+1,0);}int lowbit(int x){return x&(-x);}void add(int p,lolo x){for(int q=p;q&&q<=n;q+=lowbit(q))ta[q]+=x,ts[q]+=p*x;}void adds(int l,int r,lolo x){add(l,x),add(r+1,-x);}lolo gts(int p){lolo res=0;for(int q=p;q;res+=(p+1)*ta[q]-ts[q],q-=lowbit(q));return res;}lolo getsum(int l,int r){return gts(r)-gts(l-1);}
}BiT;
int main(){readis(N,M);BiT.init(N);for(int i=1;i<=N;i++)readi(X),BiT.adds(i,i,X);for(int i=1;i<=M;i++){readis(Opt,X,Y);if(Opt==1)readi(Z),BiT.adds(X,Y,Z);if(Opt==2)writil(BiT.getsum(X,Y));}return 0;
}

反思总结

\(\sum_{i=1}^p (p+1-i)\times b_i=(p+1)\sum_{i=1}^p i-\sum_{i=1}^p b_i\times b_i\)。记好。

http://www.hskmm.com/?act=detail&tid=30707

相关文章:

  • 鸿蒙应用开发从入门到实战(二十一):ArkUI自定义弹窗组件
  • 2025 年北京开锁机构推荐:北京锁王开锁有限公司,您身边的锁具安全专家
  • jeecg vue2前端组件
  • 2025年空天信息感知与智能处理国际学术会议(AIPIP 2025)
  • svn常用命令命令
  • 2025 年防撞护栏生产厂家最新推荐榜单:深度剖析各企业产品质量与服务能力,Q235/Q355B/景观/灯光/河道桥梁防撞护栏厂家推荐
  • 人类一败涂地Mac版下载教程|Human Fall Flat Mac安装与游戏玩法详解
  • 第二届航空航天、机械与材料工程国际学术会议 (AMME 2025)
  • 从Salesforce到国产CRM,纷享销客助力顺祥新材料提速提效
  • 再见 Navicat!DataGrip 正式宣布免费!!
  • 蓝牙语音遥控器方案 NRF52840、HS6621
  • 创意技术专家指南:如何融合编程与创造力
  • 2025 年桥梁护栏厂家最新推荐排行榜:聚焦防撞、景观、不锈钢、铝合金、灯光护栏,精选优质企业助力项目高效选型
  • 2025 年最新推荐!覆盖上海广州杭州等多地的居民同城长途异地跨城日式国际搬家公司优质服务排行榜
  • 完整教程:第 5 篇:WebGL 从 2D 到 3D - 坐标系、透视与相机
  • CUDA+torch+flash-attn安装
  • 2025 年离合器厂家最新推荐排行榜:聚焦国内优质厂商,从技术到服务多维度解析,助力企业精准选购矿山/气胎/通风式/推盘离合器厂家推荐
  • 2025 年离心机厂家最新推荐排行榜:聚焦平板 / 吊袋 / 刮刀 / 拉袋等多类型设备,精选优质企业助力用户精准选型
  • 共模电压测量:原理、方法与应用探析
  • ​​差分探头技术解析:高精度电子测量的核心工具​​
  • LGP9869 [NOIP 2023] 三值逻辑 学习笔记
  • Windows 程序开机自启的方法
  • 详细介绍:全球资本开支激增,就业增长停滞:AI时代的双刃剑
  • 2025 年昆明商务车总代理推荐艾维诺:16 年深耕高端定制与销售,奔驰丰田等品牌优选服务商
  • java面向对象
  • Chrome 安装失败且提示“无可用的更新” 或 “与服务器的连接意外终止”,Chrome 离线版下载安装教程
  • keepalived日志报错Error exec-ing command /usr/local/keepalived/chk.sh, error 8: Exec format
  • 2025 年国内树脂瓦厂家最新推荐排行榜:聚焦品质与服务,助力建筑屋面选材更可靠PVC/asa 加厚合成 / FRP/PET 树脂瓦厂家推荐!
  • 2025 年隔音板厂家最新推荐排行榜:阻尼 / 聚酯纤维 / 室外等多品类适配,聚焦口碑厂商与一站式服务
  • 2025-10-13