线段树(点查询、区间查询、区间修改)模板
简单记录一下自己的代码,以后方便复习
其实有了这样子的一个模板,题目变式自己改改就可以,比如说加减变成乘除等等。
#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#define maxn 1000005
//#define true false
//#define false true
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
const double pi = acos(-1);
typedef long long ll;
const int mod = 1e9 + 7;
using namespace std;
ll arr[maxn];
ll tree[maxn];
ll add[maxn];
void build_tree(ll node, ll start, ll ends) {if (start == ends) tree[node] = arr[start];else {ll mid = (start + ends) / 2;build_tree(2 * node, start, mid);build_tree(2 * node + 1, mid + 1, ends);tree[node] = tree[2 * node] + tree[2 * node + 1];}
}
void update_treepoint(ll node, ll start, ll ends, ll idx, ll val) { //单点修改if (start == ends) {arr[idx] = val;tree[node] = val;}else {ll mid = (start + ends) / 2;if (idx >= start && idx <= mid) update_treepoint(2 * node, start, mid, idx, val);else update_treepoint(2 * node+1, mid + 1, ends, idx, val);tree[node] = tree[2 * node] + tree[2 * node+1];}
}
void Add(ll node, ll start, ll ends, ll val) {add[node] += val;tree[node] += (ends - start + 1) * val;return;
}
void pushdown(ll node, ll start, ll ends, ll mid) {if (add[node] == 0) return;Add(node * 2, start, mid, add[node]);Add(node * 2 + 1, mid + 1, ends, add[node]);add[node] = 0;
}
void update_section(ll node, ll start, ll ends, ll l, ll r, ll val) {if (start >= l && ends <= r) return Add(node, start, ends, val);ll mid = (start + ends) / 2;pushdown(node, start, ends, mid);if (l <= mid) update_section(node * 2, start, mid, l, r, val);if (mid < r) update_section(node * 2 + 1, mid + 1, ends, l, r, val);tree[node] = tree[node * 2] + tree[node * 2 + 1];
}
ll query_tree(ll node, ll start, ll ends, ll l, ll r) {if (start >= l && ends <= r) return tree[node];ll mid = (start + ends) / 2, ans = 0;pushdown(node, start, ends, mid);if (l <= mid) ans += query_tree(node * 2, start, mid, l, r);if (r > mid) ans += query_tree(node * 2 + 1, mid + 1, ends, l, r);return ans;
}
int main()
{int n, m;cin >> n >> m;for (int i = 1; i <= n; i++) scanf("%lld", &arr[i]);build_tree(1, 1, n);ll flag;while (m--) {scanf("%lld", &flag);ll l, r, val;if (flag == 2) {scanf("%lld%lld", &l, &r);printf("%lld\n", query_tree(1, 1, n, l, r));}else {scanf("%lld%lld%lld", &l, &r, &val);update_section(1, 1, n, l, r, val);}}return 0;}
线段树(点查询、区间查询、区间修改)模板相关推荐
- HDU 3974 Assign the task(DFS序+线段树单点查询,区间修改)
描述 There is a company that has N employees(numbered from 1 to N),every employee in the company has a ...
- 数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结
文章目录 树状数组 lowbit 线段树与树状数组 单点修改 区间查询 区间修改 区间求和 二维树状数组 离线树状数组 例题 POJ:stars MooFest [SDOI2009]HH的项链 Tur ...
- FJUT 借教室 (线段树区间查询+区间修改)
解题思路:看到题目,经典的区间查询+区间修改,我们用线段树维护一段区间的最小值,每当有新的订单,我们就先查询订单时间范围内的最小教室数量,然后与Dj作比较,如果比dj小,那么我们可以标记为false, ...
- 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间
从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...
- 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...
模拟题,可以用树链剖分+线段树维护. 但是学了一个厉害的..树状数组的区间修改与区间查询.. 分割线里面的是转载的: ----------------------------------------- ...
- 树状数组的区间修改+查询
首先看树状数组是用来求前缀和比较方便的一种数据结构 sum[i] = Sigma a[i] =Sum(bit[x]) 而区间修改也不难实现 就是引入一个差分数组del del[i]表示对i~n的修改 ...
- 树状数组之区间修改单点查询
树状数组的区间修改单点查询 树状数组其实本质还单点修改区间查询,但是我们怎么延伸到这个呢,我们建立一个差分数组, 比如: a[10]={4, 6, 7, 5, 1, 6, ...
- 线段树线段树的创建线段树的查询单节点更新区间更新
目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...
- kb-07线段树-12--二分查找区间边界
1 /* 2 hdu4614 3 本题刚开始想能不能记录该区间最前面开始的点,最后面的点,区间空的数量:但是病不行 4 然后线段树的本质是区间操作,所以!这题主要就是区间的空的全放满,只要定出区间的边 ...
- poj 2892---Tunnel Warfare(线段树单点更新、区间合并)
题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...
最新文章
- 市民调取公共场所监控影像为何如此之难?
- BTC引领市场多头情绪爆发 BCH筑底完成望成上涨新风口
- 并查集 HDOJ 5441 Travel
- mysql map 键值对获取_mysql map_get function,用于解析map结构数据,根据key返回相对应value...
- js获取Json对象的长度
- Ubuntu 12.10 正式发布
- 安卓按钮设置背景颜色不管用_MIUI10新功能:时钟背景黑白自选、公交卡自定义时段唤起...
- LINQ学习中需要明确的几点问题
- Windows下配置Mysql免安装版
- java循环打印三角形_Java for循环打印三角形(基础)
- 合理设置MTU,提升下载速度
- Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor) should be the same(解决)
- 或许你不知道的10条SQL技巧
- web系统之猜数游戏——项目总结
- Java word转pdf方法
- 项目经理成长之路的三个层次
- 全网整合营销能力训练要点
- It's only too late if you decide it is. Get busy living, or get busy dying(转)
- N-Tiers设计系列(一):传统Asp运作方式
- 百钱买百鸡问题,买鸡问题的解决方案