树状数组 && 线段树
树状数组
支持单点修改
#include <cstdio> using namespace std; int n, m;
int a[], c[]; int lowbit(int x)
{
return x & -x;
} int sum(int x)
{
int ans = ;
while(x)
{
ans += c[x];
x -= lowbit(x);
}
return ans;
} void add(int x, int d)
{
while(x <= n)
{
c[x] += d;
x += lowbit(x);
}
} int main()
{
int i, j, x, y, z;
scanf("%d %d", &n, &m);
for(i = ; i <= n; i++)
{
scanf("%d", &a[i]);
add(i, a[i]);
}
for(i = ; i <= m; i++)
{
scanf("%d %d %d", &z, &x, &y);
if(z == ) add(x, y);
else printf("%d\n", sum(y) - sum(x - ));
}
return ;
}
支持区间修改
#include <cstdio>
#include <iostream> using namespace std; int n, m;
long long c0[], c1[], a[]; long long lowbit(int x) {return x & -x;} long long sum(long long *c, int x)
{
long long ans = ;
while(x)
{
ans += c[x];
x -= lowbit(x);
}
return ans;
} void add(long long *c, int x, int d)
{
while(x <= n)
{
c[x] += d;
x += lowbit(x);
}
} int main()
{
int i, j, x, y, z, k;
long long ans;
scanf("%d%d", &n, &m);
for(i = ; i <= n; i++)
{
scanf("%d", &a[i]);
add(c0, i, a[i]);
}
for(i = ; i <= m; i++)
{
scanf("%d%d%d", &z, &x, &y);
if(z == )
{
scanf("%d", &k);
add(c0, x, -k * (x - ));
add(c1, x, k);
add(c0, y + , k * y);
add(c1, y + , -k);
}
else
{
ans = ;
ans += sum(c0, y) + sum(c1, y) * y;
ans -= sum(c0, x - ) + sum(c1, x - ) * (x - );
printf("%lld\n", ans);
}
}
return ;
}
线段树
支持区间修改
add[o]表示节点o的lazy标记,且节点o已经修改完
#include <cstdio>
#include <cstring>
#include <iostream> using namespace std; #define root 1, 1, N
#define ls o << 1, l, m
#define rs o << 1 | 1, m + 1, r int L, R;
long long add[], mul[], c[], P; inline int read()
{
int x = , f = ;
char ch = getchar();
while(!isdigit(ch))
{
if(ch == '-') f = -;
ch = getchar();
}
while(isdigit(ch))
{
x = x * + ch - '';
ch = getchar();
}
return x * f;
} inline void pushup(int o)
{
c[o] = (c[o << ] + c[o << | ]) % P;
} inline void build(int o, int l, int r)
{
add[o] = ;
mul[o] = ;
if(l == r)
{
scanf("%lld", &c[o]);
return;
}
int m = (l + r) >> ;
build(ls);
build(rs);
pushup(o);
} inline void pushdown(int o, int m)
{
if(add[o] == && mul[o] == ) return;
c[o << ] = (c[o << ] * mul[o] + add[o] * (m - (m >> ))) % P;
c[o << | ] = (c[o << | ] * mul[o] + add[o] * (m >> )) % P;
add[o << ] = (add[o << ] * mul[o] + add[o]) % P;
add[o << | ] = (add[o << | ] * mul[o] + add[o]) % P;
mul[o << ] = (mul[o << ] * mul[o]) % P;
mul[o << | ] = (mul[o << | ] * mul[o]) % P;
add[o] = ;
mul[o] = ;
} inline void update(int f, int d, int o, int l, int r)
{
if(L <= l && r <= R)
{
if(f == )
{
add[o] = (add[o] + d) % P;
c[o] = (c[o] + d * (r - l + )) % P;
}
else
{
mul[o] = (mul[o] * d) % P;
add[o] = (add[o] * d) % P;
c[o] = (c[o] * d) % P;
}
return;
}
pushdown(o, r - l + );
int m = (l + r) >> ;
if(L <= m) update(f, d, ls);
if(m < R) update(f, d, rs);
pushup(o);
} inline long long query(int o, int l, int r)
{
if(L <= l && r <= R) return c[o];
pushdown(o, r - l + );
int m = (l + r) >> ;
long long ret = ;
if(L <= m) ret += query(ls);
if(m < R) ret += query(rs);
return ret;
} int main()
{
int N, Q;
N = read();
P = read();
build(root);
Q = read();
while(Q--)
{
int a, x, y, k;
a = read();
if(a == || a == )
{
x = read();
y = read();
k = read();
L = x;
R = y;
update(a, k, root);
}
else
{
x = read();
y = read();
L = x;
R = y;
printf("%lld\n", query(root) % P);
}
}
return ;
}
ps:有意思的是这个代码还是[AHOI2009]维护序列的题解
树状数组 && 线段树的更多相关文章
- 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树
正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...
- 树状数组 && 线段树应用 -- 求逆序数
参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...
- hdu1394(枚举/树状数组/线段树单点更新&区间求和)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...
- hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 5147 Sequence II【树状数组/线段树】
Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- 数据结构--树状数组&&线段树--基本操作
随笔目的:方便以后对树状数组(BIT)以及基本线段树的回顾 例题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 例题:hdu 1166 敌兵布阵 T ...
- BZOJ_1901_&_ZJU_2112_Dynamic_Rankings_(主席树+树状数组/线段树+(Treap/Splay))
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1901 给出一个长度为n的数列A,有m次询问,询问分两种:1.修改某一位置的值;2.求区间[l, ...
- BZOJ 3333 排队计划 树状数组+线段树
题目大意:给定一个序列.每次选择一个位置,把这个位置之后全部小于等于这个数的数抽出来,排序,再插回去,求每次操作后的逆序对数 首先我们每一次操作 对于这个位置前面的数 因为排序的数与前面的数位置关系不 ...
- 第十四个目标(dp + 树状数组 + 线段树)
Problem 2236 第十四个目标 Accept: 17 Submit: 35 Time Limit: 1000 mSec Memory Limit : 32768 KB Probl ...
- Curious Robin Hood(树状数组+线段树)
1112 - Curious Robin Hood PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: 64 ...
随机推荐
- Hibernate框架单向多对一关联映射关系
建立多对一的单向关联关系 Emp.java private Integer empNo //员工编号 private String empName / ...
- Html5 基础----列表详述
html5列表 标签 列表分为: 有序列表/无序列表/自定义列表,用的最多的为无序列表和自定义列表 1.有序列表(order list) eg:把
- 最强 IDE Visual Studio 2017 正式版发布
Visual Studio 2017 正式版发布,该版本不仅添加了实时单元测试.实时架构依赖关系验证等新特性,还对许多实用功能进行了改进,如代码导航.IntelliSense.重构.代码修复和调试等等 ...
- PetaPoco 快速上手
今天来给大家分享一个好用的轻型的.net框架的ORM——PetaPoco 本着快速上手的原则,我们通过和EF对比,让大家能快速使用PetaPoco PetaPoco大家可能没有听说过,但大家一定听说过 ...
- [.net 面向对象程序设计深入](14)Redis——基础
[.net 面向对象程序设计深入](14)Redis——基础 很长一段时间没更新博客了,坚持做一件事,真不是件容易的事,后面我会继续尽可能的花时间更新完这个系列文章. 因这个系列的文章涉及的范围太大了 ...
- aiohttp之添加静态资源路径
所谓静态资源,是指图片.js.css等文件.官方的说明在这里. 以一个小项目来说明,下面是项目的目录结构: . ├── static │ ├── css │ │ ├── base.css │ │ ├─ ...
- Mac 上的 outlook 一直让输入密码
Mac 上的 outlook 即便输入了正确的密码,依然提示密码错误,让重新输入,需要输入多遍之后才能连上服务器. 出现这个问题的原因可能是证书过期了. 解决方式如下: 1.找到 2. 删掉 Exch ...
- CoreAnimation 变换
CoreAnimation 变换 CoreAnimation 目录 博客园MakeDown支持不佳,如有需要请进GitHub 本片博客主要内容: 仿射变换 - CGAffineTransform 3D ...
- mui和zepto的tap事件
zepto.js和mui一起使用的时候,tap事件会发生两次,这时只要不引用zepto.js的touch.js就可以了,只用mui的tap事件转自[B5教程网]:http://www.bcty365. ...
- BootStrap入门教程 (二)
文本转自 http://www.cnblogs.com/ventlam/archive/2012/05/29/2520807.html 上讲回顾:Bootstrap的手脚架(Scaffolding)提 ...