树状数组:

 #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. RING0到RING3

    在前一篇文章里面,我们将了CPU保护模式中的几种特权RING0,RING1,RING2,RING3!操作系统通常运行在RING0,应用程序通常运行在RING3. CPU如何从RING0到RING3 先 ...

  2. Spring Boot相关组件的添加

    在勾选相关组件后, pom.xml文件上发生了根本的变化 1.这是最简单的项目的pom文件 <?xml version="1.0" encoding="UTF-8& ...

  3. (转) HTTP Request header

    HTTP Request header 当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, JSP,Perl, AJAX 等等. 无论Web技术在未来如何发展,理解Web程序之间通信的基 ...

  4. Jsoup进阶选择器

    package com.open1111.jsoup; import org.apache.http.HttpEntity;import org.apache.http.client.methods. ...

  5. 微软高性能缓存AppFabric (一) 安装

    博客原文链接:http://www.cnblogs.com/Qbit/p/6088703.html AppFabric 缓存功能的前身是VeloCity ,它是基于windows平台的一个高速内存缓存 ...

  6. java 串口通信实现流程

    1.下载64位rxtx for java 链接:http://fizzed.com/oss/rxtx-for-java 2.下载下来的包解压后按照说明放到JAVA_HOME即JAVA的安装路径下面去 ...

  7. Spring,FetchType.LAZY和FetchType.EAGER什么区别?

    1.FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载. 2.FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载. ...

  8. Android(java)学习笔记102:Dalivk虚拟机的初始化过程

    1. 初始化下面系统函数(调用dvmStartup函数初始化所有相关的函数) 开始学习虚拟机的初始化过程,先从dvmStartup函数开始,这个函数实现所有开始虚拟机的准备工作:    dvmAllo ...

  9. sublime package control以及常用插件

    一.package Control安装 1.sublime 3 import urllib.request,os; pf = 'Package Control.sublime-package'; ip ...

  10. phalcon中find 最常用

    1 官网:http://docs.iphalcon.cn/reference/models.html#finding-records 2 具体操作实例 数据: mysql> select * f ...