[模板]线段树

模板 - 线段树 ACM-ICPC模板 懒惰标记 一行序列,每次操作把一个区间里的每个数都加上一个数,或者查询一个区间的和。 typedef long long ll; typedef pair<int,int> PII; const int INF = 0x3f3f3f3f; const int N = 1e5+7; const int M = 2007; struct SegmentTree{ int l,r; ll sum;//总和 ll lz_add;//增量延迟标记 阅读详情

codevs4927

1、注意代码是左闭右闭的线段树,mid在左区间内
2、打权值线段树时注意线段树右端点大于最大值

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define L(w) w << 1
#define R(w) w << 1|1
#define INF 1061109567
typedef long long LL;
using namespace std;
const int MAXN = 200000 + 50;
int L[MAXN << 2],R[MAXN << 2],maxn[MAXN << 2],minx[MAXN << 2],M1[MAXN << 2],M2[MAXN << 2];
LL sum[MAXN << 2];
int A[MAXN];
void update(int w){
    sum[w] = sum[L(w)] + sum[R(w)];
    minx[w] = min(minx[L(w)],minx[R(w)]);
    maxn[w] = max(maxn[L(w)],maxn[R(w)]);
}
void spread1(int w){
    if(M1[w] == -1)return;
    int m = M1[w];
    M1[w] = -1;
    minx[L(w)] = maxn[L(w)] = m;
    minx[R(w)] = maxn[R(w)] = m;
    sum[L(w)] = m*(R[L(w)] - L[L(w)] + 1);
    sum[R(w)] = m*(R[R(w)] - L[R(w)] + 1);
    M2[L(w)] = M2[R(w)] = 0;
    M1[L(w)] = M1[R(w)] = m;
}
void spread(int w){
    if(M1[w] != -1){
        spread1(w);
    }
    int m = M2[w];
    if(!m)return;
    M2[w] = 0;
    spread1(L(w));
    spread1(R(w));
    maxn[L(w)] += m;
    maxn[R(w)] += m;
    minx[L(w)] += m;
    minx[R(w)] += m;
    sum[L(w)] += m*(R[L(w)] - L[L(w)] + 1);
    sum[R(w)] += m*(R[R(w)] - L[R(w)] + 1);
    M2[L(w)] += m;
    M2[R(w)] += m;
}
void build(int w,int l,int r){
    L[w] = l;R[w] = r;
    if(l == r){
        sum[w] = minx[w] = maxn[w] = A[l];
        return;
    }
    int mid = l + r >> 1;
    build(L(w),l,mid);
    build(R(w),mid + 1,r);
    update(w);
}
void cover(int w,int l,int r,int v){
    if(L[w] == l && R[w] == r){
        M2[w] = 0;
        M1[w] = v;
        minx[w] = maxn[w] = v;
        sum[w] = v*(R[w] - L[w] + 1);
        return;
    }
    spread(w);//重置前,先下放标记 
    int mid = L[w] + R[w] >> 1;
    if(r <= mid)cover(L(w),l,r,v);
    else if(l > mid)cover(R(w),l,r,v);
    else cover(L(w),l,mid,v),cover(R(w),mid + 1,r,v);
    update(w);
}
void add(int w,int l,int r,int v){
    if(L[w] == l && R[w] == r){
        spread1(w);
        M2[w] += v;
        minx[w] += v;
        maxn[w] += v;
        sum[w] += v*(R[w] - L[w] + 1);
        return;
    }
    spread(w);
    int mid = L[w] + R[w] >> 1;
    if(r <= mid)add(L(w),l,r,v);
    else if(l > mid)add(R(w),l,r,v);
    else add(L(w),l,mid,v),add(R(w),mid + 1,r,v);
    update(w);
}
LL ask_sum(int w,int l,int r){
    if(L[w] == l && R[w] == r){
        return sum[w];
    }
    spread(w);
    LL ans = 0;
    int mid = L[w] + R[w] >> 1;
    if(r <= mid)ans = ask_sum(L(w),l,r);
    else if(l > mid)ans = ask_sum(R(w),l,r);
    else ans = ask_sum(L(w),l,mid) + ask_sum(R(w),mid + 1,r);
    return ans;
}
int ask_max(int w,int l,int r){
    if(L[w] == l && R[w] == r){
        return maxn[w];
    }
    spread(w);
    int mid = L[w] + R[w] >> 1;
    int ans = -INF;
    if(r <= mid)ans = ask_max(L(w),l,r);
    else if(l > mid)ans = ask_max(R(w),l,r);
    else ans = max(ask_max(L(w),l,mid),ask_max(R(w),mid + 1,r));
    return ans;
}
int ask_min(int w,int l,int r){
    if(L[w] == l && R[w] == r){
        return minx[w];
    }
    spread(w);
    int mid = L[w] + R[w] >> 1;
    int ans = INF;
    if(r <= mid)ans = ask_min(L(w),l,r);
    else if(l > mid)ans = ask_min(R(w),l,r);
    else ans = min(ask_min(L(w),l,mid),ask_min(R(w),mid + 1,r));
    return ans;
}
int n,m,a,b,c;
string s;
int main(){
    memset(M1,-1,sizeof(M1));
    scanf("%d%d",&n,&m);
    for(int i = 1;i <= n;i ++){
        scanf("%d",&A[i]);
    }
    build(1,1,n);
    for(int i = 1;i <= m;i ++){
        cin >> s;
        if(s == "add"){
            scanf("%d%d%d",&a,&b,&c);
            add(1,a,b,c);
        }
        else if(s == "set"){
            scanf("%d%d%d",&a,&b,&c);
            cover(1,a,b,c);
        }
        else if(s == "sum"){
            scanf("%d%d",&a,&b);
            if(a > b)swap(a,b);
            printf("%lld\n",ask_sum(1,a,b));
        }
        else if(s == "max"){
            scanf("%d%d",&a,&b);
            printf("%d\n",ask_max(1,a,b));
        }
        else if(s == "min"){
            scanf("%d%d",&a,&b);
            printf("%d\n",ask_min(1,a,b));
        }
    }
    return 0;
}
T-Box功能详解及应用 T - BOX,其全称为 Telematics Box,作为远程 / 车载通信模块,是一款集车身网络与无线通讯功能于一体的智能终端设备。它充当了多媒体车机与 TSP(汽车远程服务提供商)以及互联网之间的无线路由器角色,为用户创造了远程访问的可能。用户借助T - BOX能够对车辆配备的各个 ECU(电子控制单元)进行远程操控,包括远程启动或停止发动机开启或关闭空调天窗后备箱门车门,以及实现闪灯鸣笛等功能。 阅读详情

相关推荐

dummy机械臂代码学习(六)

CLI-Tool文件夹下又包含四个子文件夹,以及一个gitignore文件、一个run_shell.py的python文件、一个run.bat文件和一个zadig exe文件。库解析命令行参数,并根据不同的命令执行相应的操作。Zadig是一个用于Windows操作系统的开源工具,它的主要功能是安装和配置USB驱动程序。的目的呢就是确保在版本控制过程中,不必要的或自动生成的文件被忽略掉,来保持代码仓库的干净和整洁。,DummyStudio的软件作者已放在GitHub,我们主要看CLI-Tool文件夹就行。

jumaohhh的博客 1432

【模板】我自己的线段树

自用线段树模板,如果你觉得有用就学习学习吧~

A's World 287

【HSCNN解析】HSCNN:从欠采样光谱图重建高光谱图的CNN网络

本文介绍HSCNN,是一个将欠采样光谱图重建为高光谱图的纯CNN网络,2017年提出。

上个大学哪有不疯的?硬撑罢了! 1623

刘汝佳 线段树模板

一、线段树(点修改) update

远古小山的专栏 1万+

大模型系列——Ollama简明教程

在这篇文章中,我们将了解如何使用 Ollama、如何在 Ollama 中创建自己的模型 以及如何使用 Ollama 构建聊天机器人。这是深入研究 Ollama 的第一部分,以及我所学到的有关本地 LLM 的知识以及如何将它们用于基于推理的应用程序。在这篇文章中,你将了解——

2401_84052244的博客 1万+

创新引入HAttention模块:提升YOLOv8小目标检测精度【YOLOv8】

YOLOv8在前几个版本的基础上进行了多项优化,特别是在模型的速度和精度上做了较大改进。改进的backbone:引入了更加高效的骨干网络(backbone)设计,如更深的网络层和更高效的特征提取模块。增强的Neck模块:使用了PANet等机制来更好地融合不同尺度的特征,增强了多尺度目标检测能力。增强的Head模块:包括多头检测头,以便针对不同大小的目标进行更精细的预测。尽管如此,YOLOv8仍面临着在小目标检测精度上不如大型目标的挑战,尤其在复杂背景或高密度目标环境下。

博客 2769

线段树模板

线段树用于区间的修改统计问题,能用线段树维护的东西,必须满足区间可加性,即可用左右子结点推出父节点。 但其实线段树的用法远不止这些,这里来总结线段树的基本模板写法。 首先是递归建树 需要注意的地方是存树的数组要开4倍大小 push_up函数用来更新结点,这里以区间求和为例 inline void push_up(int k){ t[k]=t[k<<1]+t[k<<1|1]...

qq_43290092的博客 212

在 SAP BTP ABAP 环境里直连 ABAP On-Premise OData

摘要 SAP BTP ABAP Environment 2311版本后,OData集成链路迎来重大改进:Service Consumption Model升级为v2版本,通过压缩模型到单一类减少对象数量;通信管理推荐采用Communication Arrangement替代传统Destination,提供更清晰的治理边界。新版支持同时生成OData v2/v4消费模型,并通过标准工厂类创建代理。配置需关注四层对象:Outbound Service声明协议入口,Scenario定义认证方式,System描述通

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1921

线段树 - 模板

线段树板子0: #include<cstdio> #include<iostream> #define ll long long #define _for(i,a,b) for(ll i = (a);i < (b); ++i) using namespace std; const ll maxn = 1e5+5; void build_tree(ll arr[],ll tree[],ll node,ll start,ll end){ //printf("Start : %

Spike的秃头之路 199

26. Fabric2.2 司法存证的智能合约分析

有很多同学反馈 Fabric 智能合约读起来比较费劲,对于新手不友好看不懂,这里选择一个司法存证的智能合约,阅读、分析智能合约基础框架与核心流程代码,培养大家智能合约编写的方法论。

菜鸟的博客 1340

MCP开发实战:基于openEuler系统MCP插件的开发、测试与发布全流程

MCP开发实战:基于openEuler系统MCP插件的开发、测试与发布全流程

jks212454的博客 555

线段树 模板题 笔记

线段树 模板题 笔记

flyhigh521949的博客 648

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

线段树模板整理

综述线段树的原理:将[1,n]分解成若干特定的子区间(数量不超过4*n),然后,将每个区间[L,R]都分解为少量特定的子区间,通过对这些少量子区间的修改或者统计,来实现快速对[L,R]的修改或者统计。 作用:对编号连续的一些点的区间信息进行修改或者统计操作 主要操作:区间查询、点更新、区间更新 时间复杂度:修改和统计的复杂度都是O(log(N))由原理可以看出线段树维护的信息必须满足区间加法

歪歪T的拿金之路 8120

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

线段树模板1

#include<stdio.h> const int MAXN =2e5+5; typedef long long ll; //次模板一般用于大数据,开long long int numbers[MAXN]; struct node{ int l=0,r=0;//左 右结点 int val=0;//该点的值 }tree[MAXN*4]; // /* 模板大意:对n个数,...

AXKDD6555的博客 457

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

线段树--模板

线段树的命名tree线段树的创建 build线段树的查询 query10月4日的线段树模板(现更新)问题:不够简洁#include&lt;iostream&gt; using namespace std; const int maxind=256; int segTree[maxind*4+10]; int array[maxind]; bool flag=false; inline min(in...

kala0的博客 355

线段树 模板之求和

本人水平有限,题解不到为处,请多多谅解 本蒟蒻谢谢大家观看 题目: Problem A: 线段树之Sum Time Limit:1 SecMemory Limit:128 MBSubmit:187Solved:130[Submit][Status][Web Board] Description 给定一数列,规定有两种操作,一是修改某个元素,二是...

167

【模板】线段树

【模板】线段树本篇博文只有模板,emmm。 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩。——摘自百度百科 因此,线段树是一种复杂度极为优秀(

Mashiro_ylb的博客 585

线段树模板(对应洛谷一道线段树模板题)

*最近正好在学线段树,搞懂后写一篇博客记录一下模板,供日后自己学习参考*

MrJinNEU的博客 437

线段树 模板题整理

线段树模板题整理 (基于洛谷OJ) 1.P3372 【模板】线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 将某区间每一个数加上 kk。 求出某区间每一个数的和。 输入格式 第一行包含两个整数 n, mn,m,分别表示该数列数字的个数和操作的总个数。 第二行包含 nn 个用空格分隔的整数,其中第 ii 个数字表示数列第 ii 项的初始值。 接下来 mm 行每行包含 33 或 44 个整数,表示一个操作,具体如下: 1 x y k:将区间 [x, y][x,y] 内每个数加上 kk。 2

雪岩的博客 2530

线段树模板+习题

线段树自用模板 #include <iostream> using namespace std; const int MAX_N=10010; int s[MAX_N<<2]; void up(int p) { s[p]=s[p<<1]+s[p<<1|1]; } void modify(int p,int ...

atk006680的博客 344

权值线段树【模板】

const int N = 2e4+100; int T[N<<2]; void update(int p,int v,int rt,int l,int r)//值为p的个数加v(-1表示删除,1表示添加) { T[rt]+=v; if(l==r) return ; int m=(l+r>>1); if(p<=m) update(p,v,rt<&lt...

weixin_44508514的博客 297

线段树模板1&2

洛谷上有两道线段树模板(指模板1,模板2)都是区间维护的,也就是说,都离不开lasytag的维护,为了提高效率,故使用了lasytag,这里看一下题。

2301_77920554的博客 214
上一篇: [codevs1004]四子连棋
下一篇: [模板]倍增LCA
LOI_pingxing
博客等级 码龄10年 24粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值