线段树

什么时候用线段树

1.统计量可合并

2.修改量可合并

3.通过统计量可直接修改统计量

一句话:满足区间加法即可使用线段树维护信息

理解Lazy Tage

蓝色是要把信息及时维护的节点,红色是本次区间修改操作Lazy Tage下传停止的位置。

模板  Just a Hook  HDU-1698

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std; const int maxn = * ; //线段树范围开4倍 struct Tree {
int l, r, sum, maxx;
}; Tree node[maxn];
int a[maxn];
int lazy[maxn]; void Pushdown(int rt, int m) {
if (lazy[rt]) {
lazy[rt << ] = lazy[rt];
lazy[rt << | ] = lazy[rt];
node[rt << ].sum = lazy[rt] * (m - (m >> ));
node[rt << | ].sum = lazy[rt] * (m >> );
lazy[rt] = ;
}
} void Pushup(int i) {
node[i].sum = node[i << ].sum + node[i << | ].sum;
node[i].maxx = max(node[i << ].maxx, node[i << | ].maxx);
} void Build(int i, int l, int r) {
lazy[i] = ;
node[i].l = l;
node[i].r = r;
if (l == r) {
node[i].maxx = a[l];
node[i].sum = a[l];
return;
}
int mid = l + r >> ;
Build(i << , l, mid);
Build(i << | , mid + , r);
Pushup(i);
} int getsum(int i, int l, int r) {
if (node[i].l == l && node[i].r == r) return node[i].sum;
int mid = node[i].l + node[i].r >> ;
Pushdown(i, node[i].r - node[i].l + );
if (r <= mid) return getsum(i << , l, r);
else if (l > mid) return getsum(i << | , l, r);
else return getsum(i << , l, mid) + getsum(i << | , mid + , r);
} void update(int i, int l, int r,int v) {
if (node[i].r == r && node[i].l == l) {
lazy[i] = v;
node[i].sum = v * (r - l + );
return;
}
if(node[i].l == node[i].r) return;
int mid = node[i].l + node[i].r >> ;
Pushdown(i, node[i].r - node[i].l + );
if (r <= mid) update(i << , l, r, v);
else if (l > mid) update(i << | , l, r, v);
else {
update(i << , l, mid, v);
update(i << | , mid + , r, v);
}
Pushup(i);
} int main() {
int kase = ;
int m, n, x, y, z, q;
string op;
int T;
scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &q);
for (int i = ; i <= n; i++) a[i] = ;
Build(, , n);
while (q--) {
scanf("%d%d%d", &x, &y, &z);
update(, x, y, z);
}
printf("Case %d:The total value of the hook is %d.\n", kase, getsum(, , n));
kase++;
}
return ;
}

“树状数组支持的操作:1、区间和、区间异或和、区间乘积和RMQRMQ(显然,支持的操作都具有交换律,这也算是树状数组的一大特性吧)2、单点修改 ”

code

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<cmath>
const double PI = acos(-1.0);
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std; int n, m, tree[]; inline int lowbit(int k) { //lowbit(x)是x的二进制表达式中最低位的1所对应的值
return k & -k;
} void add(int x, int k) {
while (x <= n) {
tree[x] += k;
x += lowbit(x);
}
} int sum(int x) {
int ans = ;
while (x) {
ans += tree[x];
x -= lowbit(x);
}
return ans;
} int main() {
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++) {
int a;
scanf("%d", &a);
add(i, a);
}
for (int i = ; i <= m; i++) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if (a == ) add(b, c);
if (a == ) printf("%d", sum(c) - sum(b - ));
}
return ;
}

HZNU-ACM寒假集训Day5小结 线段树 树状数组的更多相关文章

  1. AHUACM寒假集训II(线段树)

    B.Mayor's posters POJ2528 题目大意: D.Count Color POJ2777 题目大意:长为 L ( L ≤ 1 0 5 ) L( L\leq10^5) L(L≤105) ...

  2. 中南大学2019年ACM寒假集训前期训练题集(基础题)

    先写一部分,持续到更新完. A: 寒衣调 Description 男从戎,女守家.一夜,狼烟四起,男战死沙场.从此一道黄泉,两地离别.最后,女终于在等待中老去逝去.逝去的最后是换尽一生等到的相逢和团圆 ...

  3. HZNU-ACM寒假集训Day10小结 树-树形DP

    树形DP 加分二叉树 洛谷P1040 注意中序遍历的特点:当根节点编号k时,编号小于k的都在其左子树上,编号大于k的都在右子树 转移方程 f[i,j]=max{f[i,k-1]*f[k+1,j]+d[ ...

  4. HZNU-ACM寒假集训Day3小结 搜索

    简单搜索 1.DFS UVA 548 树 1.可以用数组方式实现二叉树,在申请结点时仍用“动态化静态”的思想,写newnode函数 2.给定二叉树的中序遍历和后序遍历,可以构造出这棵二叉树,方法是根据 ...

  5. 中南大学2019年ACM寒假集训前期训练题集(入门题)

    A: 漫无止境的八月 Description 又双叒叕开始漫无止境的八月了,阿虚突然问起长门在这些循环中团长哪几次扎起了马尾,他有多少次抓住了蝉等等问题,长门一共回复n个自然数,每个数均不超过1500 ...

  6. HZNU-ACM寒假集训Day11小结 贪心

    1.刘汝佳紫书区间问题三大情况 1.选择不相交区间 贪心策略:一定要选择第一个区间 2.区间选点问题 贪心策略:取最后一个点 3.区间覆盖问题: n个闭区间,选择尽量少的区间覆盖一条指定线段[s,t] ...

  7. HZNU-ACM寒假集训Day9小结 倍增

    LCA 倍增法求最近公共祖先 首先对于每个结点先进行dfs预处理它的深度,再记录下它们往父亲方向走2的0次,1次...k次步所到达的结点.在这里2的k次大于整棵树的最大深度. 预处理完后,需要查询两个 ...

  8. HZNU-ACM寒假集训Day8小结 最小生成树

    最小生成树(无向图) Kruskal 给所有边按从小到大排序 形成环则不选择(利用并查集) P1546 最短网络   https://www.luogu.com.cn/problem/P1546 #i ...

  9. HZNU-ACM寒假集训Day2小结 二分答案

    Day2 ---二分 这里直接给出模板 两种对应不同的情况 可以借助数轴理解 int bsearch_1(int l, int r) { while (l < r) { ; if (check( ...

随机推荐

  1. 工作中一些常用的linux命令

    问题一: 绝对路径用什么符号表示?当前目录.上层目录用什么表示?主目录用什么表示? 切换目录用什么命令? 答案:绝对路径:如/etc/init.d当前目录和上层目录:./  ../主目录:~/切换目录 ...

  2. PostGIS官方教程汇总目录

    一.PostGIS介绍 二.PostGIS安装 三.创建空间数据库 四.加载空间数据 五.数据 六.简单的SQL语句 七.几何图形(Geometry) 八.关于几何图形的练习 九.空间关系 十.空间连 ...

  3. 图片转换到指定大小PDF

    1.首先转换为eps jpeg2ps compile to exec file ./jpeg2ps  -p a4  a.jpg -o x.eps2.从eps转换到pdf ps2pdf -dDownsa ...

  4. Ubuntu基于Apache为自己的网站开启HTTPS

    暂时放这里链接,之后整理 https://www.deanhan.cn/ubuntu-apache-https.html

  5. 在CentOS 7环境下安装 Spark

    1.下载Spark安装包:http://mirror.bit.edu.cn/apache/spark/ 2.解压Spark的安装包并更改名称: (1)tar -zxvf spark-2.4.3-bin ...

  6. linux下解决git clone太慢

    此教程同样也适用与vscode下载太慢的问题 git和vscode会自动使用http_proxy,https_proxy环境变量的代理,所以我们只需要设置这个环境变量即可 前提 需要一个可用的代理,这 ...

  7. linux环境基于python语言docx转pdf

    windows平台因借助win32com具有多种方法将word转为pdf,但linux环境不具备此环境,win32com包也将import失败,那该如何做呢? # -*- coding: utf-8 ...

  8. JVM配合IDEA远程调试

    前言 如果测试环境中运行的jar包项目报错,需要排错时,会不太方便,这个时候就可以通过远程调试的方式,在本地打断点的方式进行调试 正文 一.首先,运行测试环境的jar包需要加以下参数: java -j ...

  9. CSAPP读书笔记--第八章 异常控制流

    第八章 异常控制流 2017-11-14 概述 控制转移序列叫做控制流.目前为止,我们学过两种改变控制流的方式: 1)跳转和分支: 2)调用和返回. 但是上面的方法只能控制程序本身,发生以下系统状态的 ...

  10. css的手机适配

    在html篇里提到设置视口宽度和设备宽度,固定的meta配置就是写死的,==死记硬背== 应该清楚的是手机端的适配应该克服的难题就是宽度根据手机屏幕的大小变化,而高度却没有办法跟随比例变化,也就是宽高 ...