线段树&树状数组模板
树状数组:
#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> ...
随机推荐
- IOS防作弊产品技术原理分析
由于时间和水平有限,本文会存在诸多不足,希望得到您的及时反馈与指正,多谢! 工具环境: iPhone 6.系统版本 10.1.1IDA Pro 7.0 0x00:防作弊产品介绍 1.由于IOS系统的不 ...
- Mysql数据库操作语句总结(三)
最近一段时间重新学习一下mysql命令行的用法, 这里简单记录一下 参考文章: https://www.cnblogs.com/bluealine/p/7832219.html 个人使用的是mysql ...
- windows10下git报错warning: LF will be replaced by CRLF in readme.txt. The file will have its original line endings in your working directory.
window10下使用git时 报错如下: $ git add readme.txtwarning: LF will be replaced by CRLF in readme.txt.The fil ...
- C++中调用Python脚本(转载)
转载▼ 标签: 杂谈 C++中调用Python脚本的意义就不讲了,至少你可以把它当成文本形式的动态链接库,需要的时候还可以改一改,只要不改变接口, C++的程序一旦编译好了,再改就没那么方便了先看Py ...
- 使用HANA Web-based Development Workbench创建最简单的Server Side JavaScript
服务器端的JavaScript, 看下wikipedia的介绍: https://en.wikipedia.org/wiki/JavaScript#Server-side_JavaScript Ser ...
- Android(java)学习笔记102:Dalivk虚拟机的初始化过程
1. 初始化下面系统函数(调用dvmStartup函数初始化所有相关的函数) 开始学习虚拟机的初始化过程,先从dvmStartup函数开始,这个函数实现所有开始虚拟机的准备工作: dvmAllo ...
- spring-boot自定义启动端口
有时候我们可能需要启动不止一个SpringBoot,而SpringBoot默认的端口号是8080,所以这时候我们就需要修改SpringBoot的默认端口了.修改SpringBoot的默认端口有两种方式 ...
- matlab一次读取多张图片
实验平台:matlab R2010Rb 读取C:\Users\KCl\Documents\MATLAB\SRCNN\Set5文件夹下所有bmp文件,并存储到im字典中 clear all clc im ...
- python redis基本操作
#!/usr/bin/env python #-*- coding:utf-8 -*- # author:leo # datetime:2019/4/24 16:26 # software: PyCh ...
- edge不能上网-代码 INET_E_RESOURCE_NOT_FOUND
这个问题 ,网上有很多解决方法,我基本都测试了一遍,可是我都没有用 情况:首先,我开始的时候是可以用的,然后在公司,开了代理,就不能使用了,这是我之后多次尝试发现的,所以你也遇到和我一样的情况不必惊慌 ...