推荐前辈学姐博客文章,写的很细

https://www.cnblogs.com/TheRoadToTheGold/p/6254255.html

学学半,此随笔主要是加深自己对线段树的理解

题目:洛谷P3374模(mu)板题

(话说为什么是树状数组,主要是因为我太菜了不会懒标记)

//代码中的位运算其实就是乘除2的一些操作#include<cstdio>
using namespace std;
int n,m,ans;
struct node {
    int left,right,num;
}tree[*+];//经典的四倍空间,我也不知道为什么
+];
void build(int index,int l,int r)//建树,一棵满二叉树
{
    tree[index].left=l,tree[index].right=r;
    if(l==r)
    {
        tree[index].num=input[l];
        return ;
    }
    ;
    build(index<<,l,mid);build(index<<|,mid+,r);
    tree[index].num=tree[index<<].num+tree[index<<|].num;
}
void add(int index,int target,int k)//单点修改,变量是序号、目标、修改值
{
    tree[index].num+=k;//对于每个可以递归到的点都是包含目标target这个点的集合,都要一并加上k
    if(tree[index].left==tree[index].right)//单点集合返回
        return ;
    ].right)
        add(index<<,target,k);
    |].left)
        add(index<<|,target,k);//两个if语句都是判断是否存在交集,是则进行下一层
}
void query(int index,int l,int r)//区间求和(区间查询)
{
    if(tree[index].right<=r&&tree[index].left>=l)
        {
            ans+=tree[index].num;//对于区间的子集累计答案
            return ;//避免累计区间子集的区间子集 ??exm
        }
    if(tree[index].right==tree[index].left)
        return ;
    ].right>=l)
        query(index<<,l,r);
    |].left<=r)
        query(index<<|,l,r);//同为寻找交集
    return ;
}
int main()
{
    scanf("%d%d",&n,&m);
    ;i<=n;i++)
        scanf("%d",input+i);
    build(,,n);//建树
    ,a,x,y;i<=m;i++)
    {
        scanf("%d%d%d",&a,&x,&y);
        )
            add(,x,y);//单点修改
        )
        {
            ans=;
            query(,x,y);//区间查询
            printf("%d\n",ans);
        }
    }  return 0;
}

等改天问一下学长们懒标记的具体

skkyk:线段树浅谈的更多相关文章

  1. P3377 【模板】左偏树(可并堆) 左偏树浅谈

    因为也是昨天刚接触左偏树,从头理解,如有不慎之处,跪请指教. 左偏树: 什 么是(fzy说)左偏树啊? 前置知识: 左偏树中dist:表示到右叶点(就是一直往右下找,最后一个)的距离,特别的,无右节点 ...

  2. 浅谈可持久化Trie与线段树的原理以及实现(带图)

    浅谈可持久化Trie与线段树的原理以及实现 引言 当我们需要保存一个数据结构不同时间的每个版本,最朴素的方法就是每个时间都创建一个独立的数据结构,单独储存. 但是这种方法不仅每次复制新的数据结构需要时 ...

  3. 【转】Senior Data Structure · 浅谈线段树(Segment Tree)

    本文章转自洛谷 原作者: _皎月半洒花 一.简介线段树 ps: _此处以询问区间和为例.实际上线段树可以处理很多符合结合律的操作.(比如说加法,a[1]+a[2]+a[3]+a[4]=(a[1]+a[ ...

  4. 数据结构3——浅谈zkw线段树

    线段树是所有数据结构中,最常用的之一.线段树的功能多样,既可以代替树状数组完成"区间和"查询,也可以完成一些所谓"动态RMQ"(可修改的区间最值问题)的操作.其 ...

  5. 浅谈线段树 (例题:[USACO08FEB]酒店Hotel)By cellur925

    今天我们说说线段树. 我个人还是非常欣赏这种数据结构的.(逃)因为它足够优美,有递归结构,有左子树和右子树,还有二分的思想. emm这个文章打算自用,就不写那些基本的操作了... 1° 简单的懒标记( ...

  6. 浅谈算法——线段树之Lazy标记

    一.前言 前面我们已经知道线段树能够进行单点修改和区间查询操作(基本线段树).那么如果需要修改的是一个区间该怎么办呢?如果是暴力修改到叶子节点,复杂度即为\(O(nlog n)\),显然是十分不优秀的 ...

  7. 浅谈树套树(线段树套平衡树)&学习笔记

    0XFF 前言 *如果本文有不好的地方,请在下方评论区提出,Qiuly感激不尽! 0X1F 这个东西有啥用? 树套树------线段树套平衡树,可以用于解决待修改区间\(K\)大的问题,当然也可以用 ...

  8. 浅谈线段树 Segment Tree

    众所周知,线段树是algo中很重要的一项! 一.简介 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点在 ...

  9. DS线段树优化最短路&&01bfs浅谈

    1简介 为什么需要?原因很简单,当需要有大量的边去连时,用线段树优化可以直接用点连向区间,或从区间连向点,或从区间连向区间,如果普通连边,复杂度是不可比拟的.下面简单讲解一下线段树(ST)优化建图. ...

随机推荐

  1. 怎么样去优化我们的SQL语句

    1.改写in 在SQL语言中,一个查询块可以作为另一个查询块中谓词的一个操作数.因此,SQL查询可以层层嵌套.例如在一个大型分布式数据库系统中,有订单表Order.订单信息表OrderDetail,如 ...

  2. Vue全家桶开发笔记

    state 中没有属性的情况下,新增属性不会触发mutations修改. 例: commit('change', { c: 3, d: 4, }); state: { test: { a: 1, b: ...

  3. (AOP)理解

    AOP的全称: Aspact  Oriented  Programming AOP的目标(作用):让我们可以“专心做事”  日志记录,事务处理,异常捕获,缓存操作. AOP原理 将复杂的需求分解出不同 ...

  4. 关于nodejs模块安装后找不到包解决办法

    主要原因是类似bower.gulp这些包后,没有添加到环境变量,但是有洁癖的我也不希望添加太多的软链接,所以在用phpstorm开始时有需要的情况下 定义临时的环境变量 http://stackove ...

  5. CF739B

    深搜的过程中保存路径,二分路径中满足要求的区段.不必将每个节点的ans加1,只需将合法区段末尾加1同时将开头减1来表示并保存在一个“前缀”数组中即可.最后再dfs一次累加得到答案. #include ...

  6. (转)VIM 一键自动添加文件头注释

    通过修改VIM的配置文件.vimrc可以让Vim(gvim)支持自动添加作者信息,具体代码如下: "进行版权声明的设置 "添加或更新头 map <F4> :call T ...

  7. Xilinx FPGA结构

    FPGA是什么?FPGA是现场可编程逻辑阵列,由可编程逻辑资源(LUT和 REG),可编程连线,可编程I/O构成.Xilinx的FPGA的基本结构是一样的,但随着半导体工艺的发展,FPGA的逻辑容量越 ...

  8. PG extract 函数示例

    pg 对时间的处理还是很灵活的, + - * /  都有支持 期间有个extract 函数还是很有用的,我们先来看看几个例子:[code] postgres=# select extract(epoc ...

  9. SAP Cloud for Customer(C4C)的一些学习资料

    经常有顾问朋友们问我想自学C4C,有什么好的资料. SAP内部确实有一些C4C培训材料,但是不能散布到公司外部. 想学习C4C,还是得到SAP官网网站上查找资料. 1. 登录https://help. ...

  10. SQLite C/C++ 教程

    目录 1安装 2 C/C++ Interface APIs 3连接到数据库 4创建表 5插入操作 6更新操作 7删除操作 安装 在我们开始使用SQLite在C / C++程序,我们需要确保SQLite ...