树状数组:

 #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. JS随机生成100个DIV每10个换行(换色,生成V字和倒V)

    附图 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...

  2. python 学习实例(cmdMD链接)

    实例1:大学网络排名爬取 https://www.zybuluo.com/myles/note/714347

  3. vue-初识

    一:vue基础1.1.Vue是一套构建用户界面的渐进式框架1.2.引入vue:<script src="https://unpkg.com/vue/dist/vue.js"& ...

  4. mybatis-分页和缓存

    1.分页 1.1在dao接口中配置分页参数: package com.java1234.mappers; import java.util.List;import java.util.Map; imp ...

  5. vue+node+mongodb实现的页面

    源代码地址:https://github.com/GainLoss/vue-node-mongodb 目前这个项目实现的是: 1.利用vue-cli实现前台页面的编写 (1)页面的跳转利用的是vue- ...

  6. innobackupex基于binlog日志的恢复 -- 模拟slave恢复

    说明:一般来说,如果恢复的binlog量不大,可以使用此方法来恢复:mysqlbinlog /data/mysqlbak/binlogbak/restoredb-bin.000018 |mysql - ...

  7. PAT (Basic Level) Practise (中文)- 1003. 我要通过!(20)

    http://www.patest.cn/contests/pat-b-practise/1003 “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入 ...

  8. 转:Python集合(set)类型的操作

    转自:http://blog.csdn.net/business122/article/details/7541486 python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系 ...

  9. SpringBoot2.X最佳实践《一》 之 SpringBoot2.x初体验

    SpringBoot2.X最佳实践 前言 本系列文章,从零基础接触  SpringBoot2.x新版本,基础入门使用,热部署,到整合各个主流框架Redis4.x,消息队列AciveMQ, Rocket ...

  10. Oracle 事务 锁

    一. 事务 是一系列的数据库操作,是数据库应用的基本逻辑单位以及并发控制的基本单位.所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位. 要将有组语句作为事务考 ...