线段树(区间更改,区间查最值)模板
主要重在理解线段树,理解了怎么改都可以,还有以后不要直接抄模板,要写出自己想的一份代码
&代码:
#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
线段树(区间更改,区间查最值)模板相关推荐
- 线段树2 求区间最小值
线段树2 求区间最小值 递归,DFS,尤其是二叉树,我只要知道我的返回节点就好,因为DFS的顺序一定是一样的,不同的题目和数据范围也是一样的,只是返回节点让DFS的深度不同. 递归的内容只有两部分:1 ...
- HDU 1166 敌兵布阵(线段树:点更新,区间求和)
HDU 1166 敌兵布阵(线段树:点更新,区间求和) http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意: 给你n个整数,然后给你多条命令,每条命令如 ...
- HDUOJ---1754 I Hate It (线段树之单点更新查区间最大值)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 线段树维护(最大区间和,最大子段和,最长连续上升子序列)
本文主要介绍用线段树来维护(最大区间和,最大子段和,最长连续上升子序列)的问题. HDU 1540 Tunnel Warfare(最长连续区间+单点修改) 洛谷 P2894 [USACO08FEB]酒 ...
- 线段树板子(区间修改)
测试题目:P3372 [模板]线段树 1 https://www.luogu.org/problemnew/show/P3372 #include<cstdio> #include< ...
- WUST 1255 巧克力(线段树的单点区间更新查询)
1355: 巧克力 Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lld Submitted: 190 Accepted ...
- 2021牛客多校4 - Tree Xor(线段树+异或区间拆分)
题目链接:点击查看 题目大意:给出一棵 nnn 个点组成的树,每个点权的取值范围是 [li,ri][l_i,r_i][li,ri],每条边权代表的是两点的异或值,现在问这棵树有多少种有效赋值 题目 ...
- 数据结构之线段树进阶(区间更新lazy标记)
之前说了线段树的点更新和区间求和.其实点更新是区间更新的一种最基础的做法.我们把一个点想像成一个区间的话,不就是最简单的区间更新了嘛. 为什么要把区间更新和点更新分开来看呢?假如我们对区间[l,r]进 ...
- 几个线段树板子(区间加/区间加与乘)
一直仰慕dl能够把线段树玩出花来,所以就想手写并整理一下几个常见的线段树板子(主要是结构化得好看一些) Part Ⅰ区间加法+区间求和 洛谷P3372 基础中的基础 //luogu P3372 199 ...
最新文章
- Linux之终端命令格式的组成
- UIBubbleTableView
- css的基本操作学习--css样式,选择器,hover,文字属性,文本属性,背景
- 改变uTools的插件安装/数据目录
- 每周论文清单:高质量文本生成,多模态情感分析,还有一大波GAN | PaperDaily #26
- 并查集(浓缩的精华模版!!!!)
- 电为啥要分交流、直流?
- 【2017级面向对象程序设计】第2次成绩排行
- php 数组 js 数组_PHP数组转换为js数组
- 个人永久性免费-Excel催化剂插件功能修复与更新汇总篇之七
- HDU - 2047
- Amber分子动力学模拟
- Python之Pygame.rect函数
- linux中运行alise,Linux学习笔记
- 美国计算机一年制,美国一年制硕士
- 淘宝海量数据产品技术架构
- 沃达丰高管:澳大利亚将于2020年迎来5G
- 如何修改Oracle VM virtualbox虚拟机的屏幕大小
- 坐标反算用计算机怎么算,卡西欧5800计算器坐标正反算程序
- 关于发现宇宙微波背景(CMB)辐射的一则趣闻
热门文章
- turtle 函数 方法_学python第十一节:turtle深入 了解
- 视觉平衡与物理平衡_设计中的平衡理论为什么这么重要?
- vc6.o--fatal error C1010错误的解决
- Win32ASM-进程学习【1】
- 【C++基础】异常处理机制概要
- Opencv——DFT变换(实现两个Mat的卷积以及显示Mat的频域图像)
- 博客上一些项目相关源码链接
- mysql gtid binlog_MySQL之-四步实现BinLog Replication升级为GTIDs Replication的代码实例
- 汇编程序中,字符数据和ASCII的对应关系
- JAVA中修改顺序表中的元素_java – 在列表中查找元素并使用stream()更改它