简单记录一下自己的代码,以后方便复习
其实有了这样子的一个模板,题目变式自己改改就可以,比如说加减变成乘除等等。

#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;}

线段树(点查询、区间查询、区间修改)模板相关推荐

  1. 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 ...

  2. 数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结

    文章目录 树状数组 lowbit 线段树与树状数组 单点修改 区间查询 区间修改 区间求和 二维树状数组 离线树状数组 例题 POJ:stars MooFest [SDOI2009]HH的项链 Tur ...

  3. FJUT 借教室 (线段树区间查询+区间修改)

    解题思路:看到题目,经典的区间查询+区间修改,我们用线段树维护一段区间的最小值,每当有新的订单,我们就先查询订单时间范围内的最小教室数量,然后与Dj作比较,如果比dj小,那么我们可以标记为false, ...

  4. 树状数组求区间和模板 区间可修改 参考题目:牛客小白月赛 I 区间

    从前有个东西叫树状数组,它可以轻易实现一些简单的序列操作,比如单点修改,区间求和;区间修改,单点求值等. 但是我们经常需要更高级的操作,比如区间修改区间查询.这时候树状数组就不起作用了,只能选择写一个 ...

  5. 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...

    模拟题,可以用树链剖分+线段树维护. 但是学了一个厉害的..树状数组的区间修改与区间查询.. 分割线里面的是转载的: ----------------------------------------- ...

  6. 树状数组的区间修改+查询

    首先看树状数组是用来求前缀和比较方便的一种数据结构 sum[i] = Sigma a[i] =Sum(bit[x]) 而区间修改也不难实现 就是引入一个差分数组del del[i]表示对i~n的修改 ...

  7. 树状数组之区间修改单点查询

    树状数组的区间修改单点查询 树状数组其实本质还单点修改区间查询,但是我们怎么延伸到这个呢,我们建立一个差分数组, 比如:                a[10]={4, 6, 7, 5, 1, 6, ...

  8. 线段树线段树的创建线段树的查询单节点更新区间更新

    目录 线段树 什么是线段树? 线段树的创建 线段树的查询 单节点更新 区间更新 未完待续 线段树 实现问题:常用于求数组区间最小值 时间复杂度:(1).建树复杂度:nlogn.(2).线段树算法复杂度 ...

  9. kb-07线段树-12--二分查找区间边界

    1 /* 2 hdu4614 3 本题刚开始想能不能记录该区间最前面开始的点,最后面的点,区间空的数量:但是病不行 4 然后线段树的本质是区间操作,所以!这题主要就是区间的空的全放满,只要定出区间的边 ...

  10. poj 2892---Tunnel Warfare(线段树单点更新、区间合并)

    题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...

最新文章

  1. 市民调取公共场所监控影像为何如此之难?
  2. BTC引领市场多头情绪爆发 BCH筑底完成望成上涨新风口
  3. 并查集 HDOJ 5441 Travel
  4. mysql map 键值对获取_mysql map_get function,用于解析map结构数据,根据key返回相对应value...
  5. js获取Json对象的长度
  6. Ubuntu 12.10 正式发布
  7. 安卓按钮设置背景颜色不管用_MIUI10新功能:时钟背景黑白自选、公交卡自定义时段唤起...
  8. LINQ学习中需要明确的几点问题
  9. Windows下配置Mysql免安装版
  10. java循环打印三角形_Java for循环打印三角形(基础)
  11. 合理设置MTU,提升下载速度
  12. Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor) should be the same(解决)
  13. 或许你不知道的10条SQL技巧
  14. web系统之猜数游戏——项目总结
  15. Java word转pdf方法
  16. 项目经理成长之路的三个层次
  17. 全网整合营销能力训练要点
  18. It's only too late if you decide it is. Get busy living, or get busy dying(转)
  19. N-Tiers设计系列(一):传统Asp运作方式
  20. 百钱买百鸡问题,买鸡问题的解决方案

热门文章

  1. 爬虫之 lxml模块的安装与使用示例
  2. 本地应用 v-for 指令
  3. 关于python的字符串大小转换函数:capitalize() title() upper() swapcase()
  4. 机器视觉系统原理及学习策略
  5. 博士笔记 | 深入理解深度学习语义分割
  6. 第6章——广度优先搜索
  7. 任正非公开信深度解读:两年怎样改变了华为?
  8. SpringMVC基础及应用-李守红
  9. PHP错误日志,解决不显示不记录日志文件等疑难杂症
  10. maven项目update报错