线段树&树状数组模板
树状数组:
#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 ;
}
线段树&树状数组模板的更多相关文章
- HDU 1166 敌兵布阵(线段树/树状数组模板题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1166 线段树模板&树状数组模板
HDU1166 上好的线段树模板&&树状数组模板 自己写的第一棵线段树&第一棵树状数组 莫名的兴奋 线段树: #include <cstdio> using nam ...
- luogu3368树状数组模板2
题目链接:https://www.luogu.org/problemnew/show/P3368 题意:与模板1不同的是这题的操作是树状数组并不在行的区间更新和单点查找,如果按照模板1那样写肯定会T. ...
- 树状数组模板(pascal) 洛谷P3374 【模板】树状数组1
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...
- 敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)
思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n) 没想到自己以前把这道题当线段树的单点更新刷了. 树状数组: #include<iostrea ...
- 敌兵布阵---hud1166(线段树或者树状数组模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 线段树中对某一点的值进行改变: #include<iostream> #includ ...
- HDU - 1166 树状数组模板(线段树也写了一遍)
题意: 汉语题就不说题意了,用到单点修改和区间查询(树状数组和线段树都可以) 思路: 树状数组的单点查询,单点修改和区间查询. 树状数组是巧妙运用二进制的规律建树,建树就相当于单点修改.这里面用到一个 ...
- 树状数组模板--Color the ball
Color the ball HDU - 1556 N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电 ...
- POJ 3928 Ping pong 树状数组模板题
開始用瓜神说的方法撸了一发线段树.早上没事闲的看了一下树状数组的方法,于是又写了一发树状数组 树状数组: #include <cstdio> #include <cstring> ...
随机推荐
- LeetCode Valid Anagram (简单题)
题意: 给出两个字符串s和t,判断串t是否为s打乱后的串. 思路: 如果返回的是true,则两个串的长度必定相等,所有字符出现的次数一样.那么可以统计26个字母的次数来解决,复杂度O(n).也可以排序 ...
- hihoCoder hiho一下 第一周 #1032 : 最长回文子串 (Manacher)
题意:给一个字符串,求最长回文子串的长度. 思路: (1)暴力穷举.O(n^3) -----绝对不行. 穷举所有可能的出现子串O(n^2),再判断是否回文O(n).就是O(n*n*n)了. (2)记录 ...
- 两数相除赋值整数变量(T-SQL)
MSSQL: DECLARE @_pagecount INT; ; SELECT @_pagecount; 结果为1 Mysql: BEGIN DECLARE _pagecount INT; ; SE ...
- pta 编程题16 Saving James Bond - Easy Version
其它pta数据结构编程题请参见:pta 题目 主要用到了深度优先搜索. #include <iostream> using namespace std; struct Vertex { i ...
- JQuery笔录
1.jQuery 的 hide() 函数,隐藏了 HTML 文档中所有的 <p> 元素.<script type="text/javascript">$(d ...
- log4j.properties中的这句话“log4j.logger.org.hibernate.SQL=DEBUG ”该怎么写在log4j.xml里面呢?
http://www.cnblogs.com/gredswsh/p/log4j_xml_properties.html 请问:log4j.properties中的这句话“log4j.logger.or ...
- 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)
点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...
- 3205: 数组做函数参数--数组元素求和1--C语言
3205: 数组做函数参数--数组元素求和1--C语言 时间限制: 1 Sec 内存限制: 128 MB提交: 178 解决: 139[提交][状态][讨论版][命题人:smallgyy] 题目描 ...
- python_62_装饰器5
import time def timer(func): #timer(test1) func=test1 def deco(*args,**kwargs): start_time=time.time ...
- CentOS创建不需要输入密码的sudo用户
linux 怎么让普通用户使用sudo权限不需要输入密码. 在网上看到很多资料,都只说到了在/etc/sudoers添加下列行即可: username ALL=(ALL) ...