树状数组:

 #include <bits/stdc++.h>

 using namespace std;

 const int MAXN = 5e5 + ;

 struct binit {
int a[MAXN], n;
void modify(int x, int k) {
while(x <= n) {
a[x] += k;
x += (x & -x);
}
}
int query(int x) {
int ans = ;
while(x) {
ans += a[x];
x -= (x & -x);
}
return ans;
}
}t; int main () {
ios::sync_with_stdio(false);
int m, opt, x, y;
cin >> t.n >> m;
for(int i = ; i <= t.n; i++) {
cin >> x;
t.modify(i, x);
}
while(m--) {
cin >> opt >> x >> y;
if(opt == ) t.modify(x, y);
else cout << t.query(y) - t.query(x-) << endl;
}
return ;
}

线段树:

 #include <bits/stdc++.h>

 using namespace std;

 typedef long long ll;

 const int MAXN = 1e5+;

 ll segtree[MAXN << ], tag[MAXN << ], a[MAXN];

 void pushup(int x) {
segtree[x] = segtree[x << ] + segtree[x << | ];
} void pushtag(int x, int l, int r) {
tag[x << ] += tag[x], tag[x << | ] += tag[x];
int mid = (l + r) >> ;
segtree[x << ] += tag[x] * (mid - l + );
segtree[x << | ] += tag[x] * (r - mid);
tag[x] = ;
} void build(int x, int l, int r) {
if(l < r) {
int mid = (l + r) >> ;
build(x << , l, mid);
build(x << | , mid + , r);
pushup(x);
} else segtree[x] = a[l];
} ll query(int x, int l, int r, int ql, int qr) {
pushtag(x, l, r);
if(ql <= l && r <= qr) return segtree[x];
int mid = (l + r) >> ; ll ans = ;
if(ql <= mid) ans += query(x << , l, mid, ql, qr);
if(qr > mid) ans += query(x << | , mid + , r, ql, qr);
return ans;
} void modify(int x, int l, int r, int ql, int qr, ll k) {
pushtag(x, l, r);
if(ql <= l && r <= qr) {
segtree[x] += (r - l + ) * k;
tag[x] += k;
} else {
int mid = (l + r) >> ;
if(ql <= mid) modify(x << , l, mid, ql, qr, k);
if(qr > mid) modify(x << | , mid+, r, ql, qr, k);
pushup(x);
}
} int main() {
int n, m, opt, x, y; ll k;
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++)
scanf("%lld", a + i);
build(, , n);
for(int i = ; i <= m; i++) {
scanf("%d", &opt);
if(opt == ) {
scanf("%d%d%lld", &x, &y, &k);
modify(, , n, x, y, k);
} else {
scanf("%d%d", &x, &y);
printf("%lld\n", query(, , n, x, y));
}
}
return ;
}

线段树(动态开点):

 #include <bits/stdc++.h>

 using namespace std;

 typedef long long ll;

 struct node {
ll data, tag;
node *lc, *rc; node () {
data = , lc = rc = NULL;
} void pushup() {
data = ;
if(lc) data += lc->data;
if(rc) data += rc->data;
} void pushtag(int l, int r) {
if(!lc) lc = new node;
if(!rc) rc = new node;
int mid = (l + r) >> ;
lc->data += (mid - l + ) * tag, lc->tag += tag;
rc->data += (r - mid) * tag, rc->tag += tag;
tag = ;
} } *st = new node; void modify(node *cur, int l, int r, int ql, int qr, ll k) {
cur->pushtag(l, r);
if(ql <= l && r <= qr) {
cur->data += (r - l + ) * k;
cur->tag = k;
} else {
int mid = (l + r) >> ;
if(ql <= mid) modify(cur->lc, l, mid, ql, qr, k);
if(qr > mid) modify(cur->rc, mid + , r, ql, qr, k);
cur->pushup();
}
} ll query(node *cur, int l, int r, int ql, int qr) {
cur->pushtag(l, r);
if(ql <= l && r <= qr) {
return cur->data;
}
int mid = (l + r) >> ; ll ans = ;
if(ql <= mid) ans += query(cur->lc, l, mid, ql, qr);
if(qr > mid) ans += query(cur->rc, mid + , r, ql, qr);
return ans;
} int main() {
int n, m, opt, x, y; ll z;
cin >> n >> m;
while(m--) {
cin >> opt;
if(opt == ) {
cin >> x >> y >> z;
modify(st, , n, x, y, z);
} else {
cin >> x >> y;
cout << query(st, , n, x, y) << endl;
}
}
return ;
}

线段树&树状数组模板的更多相关文章

  1. HDU 1166 敌兵布阵(线段树/树状数组模板题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  2. HDU 1166 线段树模板&树状数组模板

    HDU1166 上好的线段树模板&&树状数组模板 自己写的第一棵线段树&第一棵树状数组 莫名的兴奋 线段树: #include <cstdio> using nam ...

  3. luogu3368树状数组模板2

    题目链接:https://www.luogu.org/problemnew/show/P3368 题意:与模板1不同的是这题的操作是树状数组并不在行的区间更新和单点查找,如果按照模板1那样写肯定会T. ...

  4. 树状数组模板(pascal) 洛谷P3374 【模板】树状数组1

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  5. 敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)

    思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n) 没想到自己以前把这道题当线段树的单点更新刷了. 树状数组: #include<iostrea ...

  6. 敌兵布阵---hud1166(线段树或者树状数组模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 线段树中对某一点的值进行改变: #include<iostream> #includ ...

  7. HDU - 1166 树状数组模板(线段树也写了一遍)

    题意: 汉语题就不说题意了,用到单点修改和区间查询(树状数组和线段树都可以) 思路: 树状数组的单点查询,单点修改和区间查询. 树状数组是巧妙运用二进制的规律建树,建树就相当于单点修改.这里面用到一个 ...

  8. 树状数组模板--Color the ball

    Color the ball HDU - 1556 N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电 ...

  9. POJ 3928 Ping pong 树状数组模板题

    開始用瓜神说的方法撸了一发线段树.早上没事闲的看了一下树状数组的方法,于是又写了一发树状数组 树状数组: #include <cstdio> #include <cstring> ...

随机推荐

  1. uvm_hdl——DPI在UVM中的实现(四)

    我们可以在uvm中实现HDL的后门访问,具体包括的function有uvm_hdl_check_path,uvm_hdl_deposit, uvm_hdl_force,uvm_hdl_release, ...

  2. 查看mysql表和数据库的大小

    转自:http://xiaosu.blog.51cto.com/2914416/687835 1.查看数据库的大小 use 数据库名SELECT sum(DATA_LENGTH)+sum(INDEX_ ...

  3. Euerka环境搭建

    机器环境 windows10,IntelliJ IDEA 配置host 单节点Eureka 一.pom文件 <?xml version="1.0" encoding=&quo ...

  4. Aizu 2301 Sleeping Time(概率,剪枝)

    根据概率公式dfs即可,判断和区间[T-E,T+E]是否有交,控制层数. #include<bits/stdc++.h> using namespace std; int K,R,L; d ...

  5. vue安装环境

    vue安装环境 1. 安装node.js 先在电脑上安装node.js, https://nodejs.org/en/ 可以点击链接安装. 安装成功后,在命令板里检测是否安装成功, node -v 2 ...

  6. Hive之数据模型

    (本文是基于多篇文章根据个人理解进行的整合,参考的文章见末尾的整理) 数据模型 hive的数据模型包括:database.table.partition和bucket. 1.Database:相当于关 ...

  7. python_47_Python2中字符编码与转码

    #python3默认是Unicode,Unicode是万国码,不管中文字符还是英文,所有的每个字符都占2个字节空间,16位 #python2默认是ascii码 #ascii码不能存中文,一个英文只能占 ...

  8. web跨域及cookie相关知识总结

    原文:web跨域及cookie相关知识总结   之前对于跨域相关的知识一致都很零碎,正好现在的代码中用到了跨域相关的,现在来对这些知识做一个汇总整理,方便自己查看,说不定也可能对你有所帮助. 本篇主要 ...

  9. 深入理解Java GC

    一.概述 GC(Carbage Collection)垃圾收集器,由JVM自动回收已死亡的对象垃圾. 这也是Java与C++等语言的主要区别之一. 二.如何确认对象已死 1. 引用计数算法 引用计数法 ...

  10. require.js模块化开发

    模块化开发的原因: 1.引入的js过多然后在加载的过程中容易出现假死的状态,导致页面会发生白屏 2.变量名的问题 在多人协作开发的时候容易出现变量名的冲突 面向对象 3.引入优先级的问题 模块化开发分 ...