线段树(区间更改,区间查最值)模板

主要重在理解线段树,理解了怎么改都可以,还有以后不要直接抄模板,要写出自己想的一份代码

&代码:

#include <cstdio>
#include <bitset>
#include <iostream>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
const int maxn = 1e5 + 7;
struct nd {int l, r, v, lz;
} seg[maxn << 2];
int n;
inline void pushup(int rt) {seg[rt].v = max(seg[rt << 1].v, seg[rt << 1 | 1].v);
}
void pushdown(int rt) {if(seg[rt].lz) {seg[rt << 1].lz += seg[rt].lz;seg[rt << 1 | 1].lz += seg[rt].lz;seg[rt << 1].v += seg[rt].lz;seg[rt << 1 | 1].v += seg[rt].lz;seg[rt].lz = 0;}
}
void bulid(int b = 1, int e = n, int rt = 1) {seg[rt].l = b;seg[rt].r = e;if(b == e) {seg[rt].v = 0;return ;}int m = b + e >> 1;bulid(b, m, rt << 1);bulid(m + 1, e, rt << 1 | 1);pushup(rt);
}
void update(int l, int r, int xx, int b = 1, int e = n, int rt = 1) {if(l <= b && e <= r) {seg[rt].lz += xx;seg[rt].v += xx;return ;}pushdown(rt);int m = b + e >> 1;if(l <= m)update(l, r, xx, b, m, rt << 1);if(r > m)update(l, r, xx, m + 1, e, rt << 1 | 1);pushup(rt);
}
int query(int l, int r, int b = 1, int e = n, int rt = 1) {if(l <= b && e <= r) {return seg[rt].v;}pushdown(rt);int m = b + e >> 1;int re = 0;if(l <= m)re = max(re, query(l, r, b, m, rt << 1));if(r > m)re = max(re, query(l, r, m + 1, e, rt << 1 | 1));return re;
}
int main() {freopen("E:1.in", "r", stdin);n = 10;bulid();update(3, 5, 1);update(3, 5, 1);update(3, 5, 1);update(5, 6, 1);update(2, 8, 1);printf("%d\n", query(1, 10));printf("%d\n", query(5, 6));printf("%d\n", query(1, 3));printf("%d\n", query(1, 2));for(int i = 0; i < 100; i++) {if(seg[i].l) {printf("id=%d [%d , %d] val = %d  lz = %d\n", i, seg[i].l, seg[i].r, seg[i].v, seg[i].lz);}}return 0;
}

转载于:https://www.cnblogs.com/s1124yy/p/6838958.html

线段树(区间更改,区间查最值)模板相关推荐

  1. 线段树2 求区间最小值

    线段树2 求区间最小值 递归,DFS,尤其是二叉树,我只要知道我的返回节点就好,因为DFS的顺序一定是一样的,不同的题目和数据范围也是一样的,只是返回节点让DFS的深度不同. 递归的内容只有两部分:1 ...

  2. HDU 1166 敌兵布阵(线段树:点更新,区间求和)

    HDU 1166 敌兵布阵(线段树:点更新,区间求和) http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意: 给你n个整数,然后给你多条命令,每条命令如 ...

  3. HDUOJ---1754 I Hate It (线段树之单点更新查区间最大值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  4. 线段树维护(最大区间和,最大子段和,最长连续上升子序列)

    本文主要介绍用线段树来维护(最大区间和,最大子段和,最长连续上升子序列)的问题. HDU 1540 Tunnel Warfare(最长连续区间+单点修改) 洛谷 P2894 [USACO08FEB]酒 ...

  5. 线段树板子(区间修改)

    测试题目:P3372 [模板]线段树 1 https://www.luogu.org/problemnew/show/P3372 #include<cstdio> #include< ...

  6. WUST 1255 巧克力(线段树的单点区间更新查询)

    1355: 巧克力 Time Limit: 1 Sec   Memory Limit: 128 MB   64bit IO Format: %lld Submitted: 190   Accepted ...

  7. 2021牛客多校4 - Tree Xor(线段树+异或区间拆分)

    题目链接:点击查看 题目大意:给出一棵 nnn 个点组成的树,每个点权的取值范围是 [li,ri][l_i,r_i][li​,ri​],每条边权代表的是两点的异或值,现在问这棵树有多少种有效赋值 题目 ...

  8. 数据结构之线段树进阶(区间更新lazy标记)

    之前说了线段树的点更新和区间求和.其实点更新是区间更新的一种最基础的做法.我们把一个点想像成一个区间的话,不就是最简单的区间更新了嘛. 为什么要把区间更新和点更新分开来看呢?假如我们对区间[l,r]进 ...

  9. 几个线段树板子(区间加/区间加与乘)

    一直仰慕dl能够把线段树玩出花来,所以就想手写并整理一下几个常见的线段树板子(主要是结构化得好看一些) Part Ⅰ区间加法+区间求和 洛谷P3372 基础中的基础 //luogu P3372 199 ...

最新文章

  1. Linux之终端命令格式的组成
  2. UIBubbleTableView
  3. css的基本操作学习--css样式,选择器,hover,文字属性,文本属性,背景
  4. 改变uTools的插件安装/数据目录
  5. 每周论文清单:高质量文本生成,多模态情感分析,还有一大波GAN | PaperDaily #26
  6. 并查集(浓缩的精华模版!!!!)
  7. 电为啥要分交流、直流?
  8. 【2017级面向对象程序设计】第2次成绩排行
  9. php 数组 js 数组_PHP数组转换为js数组
  10. 个人永久性免费-Excel催化剂插件功能修复与更新汇总篇之七
  11. HDU - 2047
  12. Amber分子动力学模拟
  13. Python之Pygame.rect函数
  14. linux中运行alise,Linux学习笔记
  15. 美国计算机一年制,美国一年制硕士
  16. 淘宝海量数据产品技术架构
  17. 沃达丰高管:澳大利亚将于2020年迎来5G
  18. 如何修改Oracle VM virtualbox虚拟机的屏幕大小
  19. 坐标反算用计算机怎么算,卡西欧5800计算器坐标正反算程序
  20. 关于发现宇宙微波背景(CMB)辐射的一则趣闻

热门文章

  1. turtle 函数 方法_学python第十一节:turtle深入 了解
  2. 视觉平衡与物理平衡_设计中的平衡理论为什么这么重要?
  3. vc6.o--fatal error C1010错误的解决
  4. Win32ASM-进程学习【1】
  5. 【C++基础】异常处理机制概要
  6. Opencv——DFT变换(实现两个Mat的卷积以及显示Mat的频域图像)
  7. 博客上一些项目相关源码链接
  8. mysql gtid binlog_MySQL之-四步实现BinLog Replication升级为GTIDs Replication的代码实例
  9. 汇编程序中,字符数据和ASCII的对应关系
  10. JAVA中修改顺序表中的元素_java – 在列表中查找元素并使用stream()更改它