简单线段树模板

产品路线图的三种模型(RICE/MoSCoW/Kano),教你如何对需求进行优先级排序 RICE/MoSCoW/Kano三种模型,教你如何对需求进行优先级排序。 也许你会让业务提供一份ROI,记得前不久参加过一场立项会评审,一位很有意思的小产品在会上讲不清楚ROI,评审们要求会后重新梳理,小产品表达不要为难业务方干一些他们不擅长的事了。这个看似笑话的经历,背后隐藏着价值判断已经流于形式。 也许你会要求业务方直接给出需求优先级列表,把任务分为P0到P5,这样的划分除了按需求本质的优先级还同时考虑了开发资源、开发难度等问题。毫不夸张地说,我曾经拿到一张全是P0级别的需求清单,如果一切任务都是高 阅读详情

为什么需要线段树

#include <stdio.h>
#include <iostream>
#include <string.h>
#include<vector>
#include<queue>
using namespace std;
const int maxn = 5000;
int arr[6] = {2,6,8,9,5,3};
int size = 6;
int tree[15] = {0};

void build(int node,int start,int end){
    if(start == end){
        tree[node] = arr[start];
    }
    else{
        int mid = (start + end) / 2;
        int left_node  = 2 * node + 1;
        int right_node = 2 * node + 2;
        build(left_node,start,mid);
        build(right_node,mid + 1,end);
        tree[node] = tree[left_node] + tree[right_node];
    }


}

void update(int node,int start,int end,int idx,int val){
    if(start == end){
        tree[node] = val;
        arr[idx] = val;
        return;
    }
    else{
        int mid  = (start + end) / 2;
        int left_node  = 2 * node + 1;
        int right_node = 2 * node + 2;
        if(idx <= mid )update(left_node,start,mid,idx,val);
        else update(right_node,mid+1,end,idx,val);
        tree[node] = tree[left_node] + tree[right_node];
    }
}

int query(int node,int start,int end,int L,int R){
    printf("start = %d\n",start);
    printf("end = %d\n",end);
    printf("\n");
    if(R < start || L > end){
        return 0;
    }
    if(start == end){
        return tree[node];
    }
    else if(L <= start&& end <= R){
        return tree[node];
    }
    else{
        int mid = (start + end) / 2;
        int left_node  = 2 * node + 1;
        int right_node = 2 * node + 2;
        int sum_left  = query(left_node,start,mid,L,R);
        int sum_right = query(right_node,mid + 1,end,L,R);
        return sum_left + sum_right;
    }
}
int main()
{
    build(0,0,size-1);
    for(int i = 0; i < 15;++i){
        printf("tree[%d]:%d\n",i,tree[i]);
    }
    printf("\n");
    for(int i = 0; i < size;++i){
        printf("index:%d  val:%d\n",i,arr[i]);
    }
    update(0,0,size-1,3,4);
    for(int i = 0; i < 15;++i){
        printf("tree[%d]:%d\n",i,tree[i]);
    }

    printf("\n");
    for(int i = 0; i < size;++i){
        printf("index:%d  val:%d\n",i,arr[i]);
    }
    int r = query(0,0,size-1,2,5);
    printf("%d\n",r);

        return 0;
}

带懒惰标记的求和
(和懒加载的思想差不多,只有当你真正想要的时候,我再做,再返回给你)

#include <stdio.h>
#include <iostream>
#include <string.h>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn = 1e6+5;
struct T{
    int L,R;
    ll x,lazy;
}tree[4 * maxn];

void pushup(int node){
    tree[node].x = tree[node<<1].x + tree[node<<1|1].x;
}
void pushdown(int node){
    if(tree[node].lazy){
        tree[node<<1].x   += (tree[node<<1].R - tree[node<<1].L +1) * tree[node].lazy;
        tree[node<<1|1].x += (tree[node<<1|1].R - tree[node<<1|1].L + 1) * tree[node].lazy;
        tree[node<<1].lazy += tree[node].lazy;
        tree[node<<1|1].lazy += tree[node].lazy;
        tree[node].lazy = 0;
    }
}
void build(int node,int L,int R){
    tree[node].L = L;
    tree[node].R = R;
    tree[node].lazy = 0;
    if(L == R){
        scanf("%lld",&tree[node].x);
        return;
    }
    int mid = (L+R)/2;
    build(node<<1,L,mid);
    build(node<<1|1,mid+1,R);
    pushup(node);
}

//区间修改
void update(int node,int L,int R,long long x){
    if(R < tree[node].L || L > tree[node].R)return;
    if(L <= tree[node].L && tree[node].R <= R){
        tree[node].x += (R - L)*x;
        tree[node].lazy += x;
        return;
    }
    pushdown(node);
    update(node<<1,L,R,x);
    update(node<<1|1,L,R,x);
    pushup(node);
}

long long query(int node,int L,int R){
    if(L <= tree[node].L && R >= tree[node].R){
        return tree[node].x;
    }
    if(R < tree[node].L || L > tree[node].R){
        return 0;
    }
    pushdown(node);
    return query(node<<1,L,R) + query(node<<2|1,L,R);

}

int main()
{
    build(1,1,6);

    for(int i = 0; i < 16;++i){
        printf("tree[%d]:%d\n",i,tree[i].x);
    }
    printf("\n");
    update(1,1,3,2);
    for(int i = 0; i < 16;++i){
        printf("tree[%d]:%d\n",i,tree[i].x);
    }
    long long r = query(1,1,2);
    printf("\n");
    for(int i = 0; i < 16;++i){
        printf("tree[%d]:%d\n",i,tree[i].x);
    }
    printf("%d\n",r);

        return 0;
}

西南科技大学数字电子技术实验七(4行串行累加器设计及FPGA实现)FPGA部分 /在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入1,并在k=0时运算。//在k=1时输入0,并在k=0时运算。//在k=1时输入0,并在k=0时运算。三、程序清单(每条语句必须包括注释或在开发窗口注释后截图)四、综合、管脚分配、生成输出文件、下载(所有步骤截图)五、仿真程序清单、波形(波形截图必做,截图!.k(k),//开关。 阅读详情

相关推荐

LaTeX参考文献格式apsrev4-1,增加文献标题

APS的LaTeX参考文献格式apsrev4-1是隐藏标题的,如果想要出现标题,需要更改apsrev4-1.bst文件内容 在apsrev4-1.bst文件靠后部分,定义不同类型文献格式的地方,将article类型的内容替换为, FUNCTION {article} { output.bibitem format.authors booktitle empty$ { "author" output.check }{ output } if$ author format.

loading1234567的博客 5031

线段树模板+详解

线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区 间,每个单元区间对应线段树中的一个叶结点。 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a, (a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二叉树,最后的子 节点数目为N,即整个线段区间的长度。 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂

Usher_Ou的博客 1840

PHP版本对接支付宝支付接口 电脑网站 详细介绍 沙箱环境 超简单易懂

PHP版本对接支付宝支付接口 其实理顺了思路后,按照我接下来的步骤来,真的超级简单啊,为啥有那么多的朋友们折腾了那么久呢,嘿嘿,跟我走吧~ 我是昨天晚上洗完澡之后,大概八九点,才开始正式开工尝试去这一工程的,我去支付宝的蚂蚁金服开放平台里把各个知识点和文档大概都看了一遍,大致弄明白了要怎么操作了,建议大家看看电脑网站开发文档,忙到了夜里十二点左右,成功地用支付宝给的Demo完成了付款操...

爱玲姐姐的博客 1万+

C++ 线段树—模板&总结

在信息学竞赛中,经常遇到这样一类问题:这类问题通常可以建模成数轴上的问题或是数列的问题,具体的操作一般是每次对数轴上的一个区间或是数列中的连续若干个数进行一种相同的处理。常规的做法一般依托于线性表这种数据结构,导致了处理只能针对各个元素逐个进行,因此算法的效率较低。 线段树是一种能够有效处理区间操作的高级数据结构,利用这种数据结构,我们能够设计出针对上述问题更加高效的算法。 线段树的题...

weixin_30881367的博客 620

Modelsim安装教程以及管理员身份运行patch_dll.bat时找不到文件mgls.dll的解决

Modesim安装教程 Modesim版本有很多,但是安装方式大都相同,我们以modesim.10.5为例,电脑使用的是win10 64位,讲一下安装过程中的步骤以及出现问题的解决方法 一 安装 1.首先解压安装包,在解压的安装包内选择应用程序,右键选择管理员运行。 2.稍等一会,有的电脑会弹出是否允许modesim进行更改,选择 是 即可,然后出现下面的界面,点击下一步。 3.弹出此界面选择安装路径,选择安装路径,我是在D盘新建的文件夹,直接把文件夹中的路径复制在框内。文件夹名称切记不要带中文 4.

weixin_48564372的博客 1万+

基于qiime2的16S数据分析全流程:从导入数据到下游分析一条龙

基于qiime2的16s测序数据分析分析激活qiime环境我已经把上面这句代码放在了.bashrc里面,因此激活qiime2环境只需要运行activate_qiime即可/bin/bash# 设置目录路径# 输出表头 echo -e "sample-id\tforward-absolute-filepath\treverse-absolute-filepath"# 遍历_R1和_R2文件do # 检查R1文件是否存在then# 获取样本ID(去掉_R1.fastq.gz)

2301_76771985的博客 5518

线段树-简单线段树模板

简单线段树 2021年7月30 线段树是干什么的? 更新,维护,查询某区间的某项值,如区间和等。 线段树的原理 与树状数组类似,线段树通过直接建树来保存区间的结点,如图: 如何建图? 下面以求序列区间和为例: 当存放一个数字时,它需要将每个子区间的值返回到父节点之上,依次返回直到最大的区间上。此时,一个区间接收到的值就是它所有子区间值的和。 由于每个区间的大小都为1<<i,0<=i<=n,因此,我们构建的树是一颗二叉树。按行进行标号,易得第i个区间的两个子区间标号分别为i * 2与

Tinberlake的博客 160

Windows平台MuJoCo仿真环境配置与Qt集成实战

本文详细介绍了在Windows平台上配置MuJoCo物理仿真环境并与Qt框架集成的完整实战流程。内容涵盖从环境准备、库文件配置、项目创建到核心代码编写的每一步,重点解决了Windows下常见的编译链接错误和路径问题,帮助开发者在Windows系统中高效搭建机器人仿真与可视化控制开发环境。

weixin_29221753的博客 169

各类简单的线段树模板(来自codevs)

本蒟蒻最近在学线段树,在学校大佬的推荐下在codevs上发现了三个比较具有代表性的线段树的模板,下面是题面线段树练习线段树练习2线段树练习3(当然在这里我只负责提供这三类简单的模板,不负责教授线段树的相关知识,各位大佬,见谅!)线段树练习代码(单点修改区间查询)#include&lt;iostream&gt; #include&lt;algorithm&gt; #include&lt;cstdio...

Palace_的博客 1198

YOLO26优化:注意力魔改 | EMA:基于跨空间学习的高效多尺度注意力,效果优于ECA、CBAM、CA

加入EMA注意力,一种基于跨空间学习的高效多尺度注意力,效果优于ECA、CBAM、CA等经典注意力。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 332

基于STM32设计的个人健康检测仪(华为云IOT)(191)

本系统采用华为云物联网平台实现数据云端存储与分析,并通过自研手机APP提供远程监控界面,让用户无论身处何地都能及时掌握自身的健康数据,为用户提供个性化的健康管理方案,同时也为医疗机构提供了便捷的数据获取途径,助力实现智能化、精细化的医疗服务。

1678

线段树(简单模板)

#define LL long long struct hh { int l,r,ls,rs;//l,r为边界,ls,rs为左右儿子的编号 LL date;//权值 }t[800000]; LL n,m,num=0,x,y,v,pd,a[200010],add[200010];//add为标记要增大的值的数组 void pushup(int i)//重新求权值 { t

ojzha的博客 419

AI智能体丨使用Coze一键生成爆款书单视频,3个月内获赞131.1w!(附保姆级教程)

这篇教程详细介绍了如何使用扣子(Coze)平台的AI智能工作流批量制作爆款书单视频。通过自动化流程,只需1-2分钟即可生成45-50秒的书单视频,效率提升近百倍。工作流包含文案生成、音频合成、图片素材获取、视频剪辑等全流程,支持随机生成8本书单、自动提取金句、智能配音等功能。教程提供了完整的操作步骤,包括剪映草稿配置、特效添加等细节,并附体验链接和示例效果。最终生成的视频包含书单展示、金句字幕、背景音乐等元素,适合书单号运营者快速批量产出内容。

李同学Lino的博客 2354

线段树简单区间更新模板+练习

POJ-3468 - A Simple Problem with Integers(线段树区间更新模板) http://poj.org/problem?id=3468 Description You haveNintegers,A1,A2, ... ,AN. You need to deal with two kinds of operations. On...

weixin_30299539的博客 75

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

从一道模板题 详细讲解线段树的简单操作

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 165956 Accepted Submission(s): 67969 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek

H_define的博客 403

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

hdu1156(简单线段树 模板题)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 118938    Accepted Submission(s): 49756 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍...

yu121380的博客 619

线段树模板(史上最简单易懂的数据结构)

什么是线段树? 线段树言下之意就是将线段分解为一颗树,并且这颗树是一颗二叉树,树上的每一个节点都具有某些性质。 线段树有什么用? 线段树主要能够在O(logn)的时间复杂度上解决区间上的问题。 题目引入:AcWing243.一个简单的整数问题2 本题目就是很简单的线段树的板子题,可以用来当做模板来使用。 线段树的几个重要操作: 1.tree[]数组的建立: struct node{ int l;//表示左端点 int r;//表示右端点 int v;//表示区间内的...

weixin_54442315的博客 3774

简单的线段树模板题之情人节

问题: 这道题可以用线段树来做,首先建树,假设每个女生拥有的花的数量如下图 我们觉得2号女生没有花好可怜啊,于是我们给她加一枝花,就从节点开始,找到2,+1,那么【1,2】,【1,4】也要+1; 伪代码 void build(int p,int l,int r) { if(l==r) { tree[p]=a[l];retur...

x1037490413的博客 210

线段树基础与模板与简单应用

线段树参考自http://www.cnblogs.com/TenosDoIt/p/3453089.html线段树,类似区间树,它在各个节点保存一条线段(数组中的一段子数组),主要用于高效解决连续区间的动态查询问题,由于二叉结构的特性,它基本能保持每个操作的复杂度为O(logn)。线段树的每个节点表示一个区间,子节点则分别表示父节点的左右半区间,例如父亲的区间是[a,b],那么(c=(a+b)/2)左

WaveBridge的博客 391

线段树简单入门模板--单点更新

package lanqiaobei; import java.util.*; /* * 线段树模板(以各个区间和为例, * 其他的稍微变动一下就好啦,比如求解max,那么就把sum换成max(a,b)) * 建树 * 单点/区间 查询 * 单点/区间 更新 * 主要思想:递归,树的左右子判断,区间判断 */ public class Main { static

JingleLiA的博客 426

简单线段树(模板)

A - I Hate It HDU - 1754 模板,单点更新,区间查询 1 #include <iostream> 2 #include <cstring> 3 #include <string> 4 #include <map> 5 #include <set> 6 #include...

dieche3140的博客 99

线段树简单单点更新模板+练习

HDU-1754 I Hate It http://acm.hdu.edu.cn/showproblem.php?pid=1754 Problem Description 很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。这让很多学生很反感。不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需...

weixin_30299539的博客 120

P2068 统计和(线段树/树状数组 简单模板题)

题目描述 前两天刚学习了线段树和树状数组~于是今天拿一道基础题练练手,基本上就是套模板,最重要的是理解! 线段树做法 #include<cstdio> const int MAXN=100005; int n,w; int k[MAXN*2]; void add(int a,int v,int l,int r,int cur) { if(l==r){ k[cu...

弋墨尘的博客 275

AcWing 243. 一个简单的整数问题2 (线段树 区间修改+求区间和模板)

线段树,区间修改+求区间和模板。

qiaodxs的博客 204

某个区间的值发生改变----(线段树)简单模板

苍茫大地一剑尽挽破,何处繁华笙歌落。斜倚云端千壶掩寂寞,纵使他人空笑我。 原文代码链接https://blog.youkuaiyun.com/qq_42754826/article/details/82817763 #include<bits/stdc++.h> using namespace std; #define lc (p<<1) #define rc (p&lt...

0k-ok 431

一个简单的整数问题【树状数组 + 线段树模板 + 解惑小白细节(本人小白)】

多看题解,题解是书!

m0_63613132的博客 143
上一篇: 打印月历
下一篇: 并查集
softwareX4
博客等级 码龄9年 21粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值