首页 > 其他分享 >线段树模板

线段树模板

时间:2024-02-20 09:13:38浏览次数:29  
标签:int max 线段 tree mid now sum 模板

开局宏定义:

#include<bits/stdc++.h>
#define int long long
#define lson (now << 1)//现结点的左孩子
#define rson (now << 1 | 1)//右孩子
using namespace std;

结构体定义:

struct Node{
    int l ,r;  //表示左右区间
    int max, sum; //其他数据域
}tree[N << 2] //=N*4,N指节点个数

常规操作

  • 向上回溯:
void push_up(int now){
    tree[now].sum += tree[lson].sum + tree[rson].sum;
    tree[now].max = max(tree[lson].max, tree[rson].max);
}
  • 建树:
void build(int now, int l, int r) {
    tree[now].left = l; tree[now].right = r;

    if(l == r){
        tree[now].sum = a[l];
        return;
    }

    int mid = (l + r) >> 1;
    build(lson, l, mid),build(rson, mid+1, r);

    push_up(now);
}
  • 单点更新:
void update(int now, int pos, int key){
    if(tree[now].left == l and tree[now].right <= r){
        tree[now].sum = tree[now].max = key;
        tree[now].lazy += key;
        return;        
    }

    int mid = (tree[now].left + tree[now].right) >> 1;

    if(l <= mid) update(lson, pos, key);
    if(r > mid) update(rson, pos, key);

    push_up(now);
}
  • 查询区间和:
 int query(int now, int l, int r){
    if( l <= tree[now].left and tree[now].right <= r)
          return tree[now],sum;
    
    int mid = (tree[now].left + tree[now].rigth) >> 1;

    if(l <= mid) retur query(lson, l, r);
    if(r > mid) return query(rson, l, r);
}

标签:int,max,线段,tree,mid,now,sum,模板
From: https://www.cnblogs.com/zyzAqr/p/18022281

相关文章

  • 线段树(板子)
    线段树单点修改,单点,区间查询区间修改,单点,区间查询单点修改普通线段树code#definels(rt<<1)#definers(rt<<1|1)#definellllonglongconstintN=1000001;intn,m;inta[N];structT{ intl,r,data;}tr[N<<2];voidpushup(intrt){ tr[rt].da......
  • **SiteServer CMS远程模板下载getshell漏洞导致的黑SEO利用分析**
    前言某日中午,收到上级下发的任务,涉及一代理商客户网站发现异常SQ内容,要求进行溯源分析并找出根本原因。0x01初步分析通过提供的链接(www.xxx.com.cn/2023j19tPLKn2/55151),确认涉及黑帽SEO活动,通过百度搜索进一步验证也证实了这一点。0x02日志分析黑客常常在植入菠菜或非......
  • 线段树-基础模版
    线段树模版一埋头扎进线段树一上午感觉很神奇几个函数就能把它完整的复现下来这里有几张基础概念的图对着代码来想还是很好理解的最后是整理了能够处理总和最大值和最小值的线段树模版code:$\LARGE\color{purple}{代码在这里}$#include<bits/stdc++.h>usingnames......
  • 树状数组及线段树详解
    本文章是作者调了3个多小时后,感触颇深,历经1个多小时写出来的,不喜勿喷相关内容可参考模板总结中的树状数组及线段树;进入正题树状数组所谓树状数组,即像树的数组,一般应用于求多次前缀和以及区间前缀和的问题中;其根据节点编号的二进制数的末尾0的个数划分层次,每个节点的管辖......
  • C++ 模板的笔记1
    C++模板的笔记1C++函数模板函数模板的定义函数模板是一种可以生成不同类型函数的函数声明。函数模板的参数类型不是固定的,而是在调用时由实参类型推导出来。语法:template<typename参数列表>函数返回值类型函数名(参数列表){函数体}示例:template<typenameT>vo......
  • N叉树遍历模板
    N叉树(N-aryTree)的类型和代码模板与二叉树有些相似,但由于N叉树具有多个子节点,因此在遍历和节点定义上有所不同。以下是N叉树的类型和相应的代码模板:N叉树节点的定义:classNode:def__init__(self,val=None,children=None):self.val=valself.children......
  • 模板默写
    别到时候题会做了板子不会写……数据结构主席树ProbFHQTreap可持久化FHQTreap图论支配树Prob上下界最大/最小流带负圈的费用流数学万能欧几里德杜教筛字符串ACAMSASAMGSAM……......
  • P1439 【模板】最长公共子序列
    首先找最大公共子序列,可以轻松想到$O(n^2)$的dp转移式子,$f_{i,j}=max\begin{cases}f_{i-1,j}&i>0\f_{i,j-1}&j>0\f_{i-1,j-1}+1&i>0,j>0,A_i=A_j\end{cases}$但是我们发现最后$n\le10^5$所以$n^2$的复杂度不够优,这个时候再看题目,发现A,B都是 1~n的排列,由此可知A,B......
  • P3384 【模板】重链剖分/树链剖分 - SGT && 重链剖分
    本题是非常非常非常纯粹的树剖,利用了重链剖分后下标的性质不多说上代码就好了#include<cstdio>#include<vector>#definelllonglongusingnamespacestd;constintN=1e5+5;intn,m,r;llp,a[N],b[N];vector<int>V[N];intfa[N],dep[N],siz[N],hson[N]......
  • 快读快写模板
    快读函数点击查看代码intread(){intsign=1,re_in=0;charc=getchar();while(c<'0'||c>'9'){if(c=='-')sign=-1;c=getchar();}while(c>='0'&&c<='9'){......