[模板]非递归线段树(zkw的变异版本)
类似于zkw,但空间只用两倍,zkw要4倍。
可以下传标记,打熟后很好码。
#include <set>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <assert.h>
#include <algorithm>
using namespace std;
#define LL long long
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define GO debug("GO\n")
inline int rint() {
register int x = 0, f = 1; register char c;
while (!isdigit(c = getchar())) if (c == '-') f = -1;
while (x = (x << 1) + (x << 3) + (c ^ 48), isdigit(c = getchar()));
return x * f;
}
template<typename T> inline void chkmin(T &a, T b) { a > b ? a = b : 0; }
template<typename T> inline void chkmax(T &a, T b) { a < b ? a = b : 0; }
const int maxN = 1e5 + 10;
int n, h, m;
LL sum[maxN * 2], tag[maxN * 2];
void build() {
for (h = 1; 1 << h < n; ++ h);//计算树高
for (int i = n + 1; i <= 2 * n; ++ i) sum[i] = rint();
for (int i = n; i >= 1; -- i) sum[i] = sum[i<<1] + sum[i<<1|1];
}
void add(int x, int val, int len) {
sum[x] += val * len;
if (x <= n) tag[x] += val;//如果不是是叶子才打标记
}
void pu(int x) {
int len = 1;
while (x > 1) len<<=1, x >>= 1, sum[x] = sum[x<<1] + sum[x<<1|1] + tag[x] * len;//从下往上,儿子的值不一定正确,需要累上标记
}
void pd(int x) {
for (int i = h, len = 1 << (h - 1); i > 0; -- i, len >>= 1) {//从上到下len初始为1<<(h-1)
int y = x >> i;
if (tag[y]) {//下传标记
add(y<<1, tag[y], len);
add(y<<1|1, tag[y], len);
tag[y] = 0;
}
}
}
void modify(int l, int r, int val) {
l += n, r += n;
int l0 = l, r0 = r;
for (int len = 1; l <= r; l = (l + 1) >> 1, r = (r - 1) >> 1, len <<= 1) {//从下往上,叶子节点len为1
if (l & 1) add(l, val, len);
if (r & 1 ^ 1) add(r, val, len);
}
pu(l0); pu(r0);//别忘了pushup
}
LL query(int l, int r) {
l += n, r += n;
pd(l); pd(r);//查询前要下传该区间标记
LL ans = 0;
for (; l <= r; l = (l + 1) >> 1, r = (r - 1) >> 1) {
if (l & 1) ans += sum[l];
if (r & 1 ^ 1) ans += sum[r];
}
return ans;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("xhc.in", "r", stdin);
freopen("xhc.out", "w", stdout);
#endif
n = rint(), m = rint();
build();
int op, x, y, k;
while (m --) {
op = rint(), x = rint(), y = rint();
if (op == 1) {
k = rint();
modify(x, y, k);
} else {
printf("%lld\n", query(x, y));
}
}
}
[模板]非递归线段树(zkw的变异版本)的更多相关文章
- 【模板】 递归线段树 [2017年五月计划 清北学堂51精英班Day4]
P3372 [模板]线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别 ...
- 敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)
思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n) 没想到自己以前把这道题当线段树的单点更新刷了. 树状数组: #include<iostrea ...
- 线段树简单入门 (含普通线段树, zkw线段树, 主席树)
线段树简单入门 递归版线段树 线段树的定义 线段树, 顾名思义, 就是每个节点表示一个区间. 线段树通常维护一些区间的值, 例如区间和. 比如, 上图 \([2, 5]\) 区间的和, 为以下区间的和 ...
- 【洛谷P3834】(模板)可持久化线段树 1(主席树)
[模板]可持久化线段树 1(主席树) https://www.luogu.org/problemnew/show/P3834 主席树支持历史查询,空间复杂度为O(nlogn),需要动态开点 本题用一个 ...
- [CSP-S模拟测试]:模板(ac)(线段树启发式合并)
题目描述 辣鸡$ljh\ NOI$之后就退役了,然后就滚去学文化课了.他每天都被$katarina$大神虐,仗着自己学过一些姿势就给$katarina$大神出了一道题.有一棵$n$个节点的以$1$号节 ...
- 洛谷P3834 [模板]可持久化线段树1(主席树) [主席树]
题目传送门 可持久化线段树1(主席树) 题目背景 这是个非常经典的主席树入门题——静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定 ...
- [P5490] 【模板】扫描线 - 线段树
求 \(n\) 个矩形的面积并 Solution 将矩形转化为 \(y_1\) 位置的 + 修改 和 \(y_2\) 位置的 - 修改.然后按照 \(+y\) 顺序依次处理所有的修改,到达的一个新的位 ...
- hdu 3887 Counting Offspring(DFS序【非递归】+树状数组)
题意: N个点形成一棵树.给出根结点P还有树结构的信息. 输出每个点的F[i].F[i]:以i为根的所有子结点中编号比i小的数的个数. 0<n<=10^5 思路: 方法一:直接DFS,进入 ...
- Range Sum Query - Mutable 精简无递归线段树
操作: 单点更新,区间求和 区间求和:如sum [3,10) 需要对19,5,12,26节点求和即可. 观察可知,左端点为右子节点(奇数)时直接相加,右端点为左子节点(偶数)时直接相加,两边向中间移动 ...
随机推荐
- 课时8.HTML作用(掌握)
什么是HTML? HTML其实是HyperText Markup Language的缩写,超文本标记语言 如何重命名文件? 点击右键重命名 点击F2 首先利用记事本保存了一个标题和两段描述,然后修改纯 ...
- oracle在线迁移同步数据,数据库报错
报需要升级的错误,具体处理步骤如下: 一.错误信息 SQL> alter database open ;alter database open resetlogs*ERROR at line 1 ...
- 12种开源Web安全扫描程序
转自:https://blog.csdn.net/wh211212/article/details/78620963 赛门铁克的一个有趣的报告显示,76%的被扫描网站有恶意软件 如果您使用的是Word ...
- C++练习 | 创建并正序输出不带头结点的链表
#include <iostream> #include <cstdio> #include <stdlib.h> using namespace std; str ...
- HDU 1411--校庆神秘建筑(欧拉四面体体积计算)
校庆神秘建筑 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- Spring MVC体系
框架搭建 web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xs ...
- react路由配置(未完)
React路由 React推了两个版本 一个是react-router 一个是react-router-dom 个人建议使用第二个 因为他多了一个Link组件 Npm install react-ro ...
- MVC Controller 基类 BaseController 中的 Request
今天修复mvc中的一个bug,需求是每个页面要获取当前URL链接中 host首是否正确,我把获取url的方法写到了Controller的基类BaseController(BaseController继 ...
- Hive(8)-常用查询函数
一. 空字段赋值 1. 函数说明 NVL:给值为NULL的数据赋值,它的格式是NVL( value,default_value).它的功能是如果value为NULL,则NVL函数返回default_v ...
- 树莓派驱动DHT22
树莓派-DHT22测量湿度 一般的温湿度传感器有dht11和dht22,dht11比较便宜,dht22比dht11贵好几倍,自然测量的准确度肯定是dht22高一些.追求更高精准度的可以使用SHT1x. ...