树状数组 && 线段树
树状数组
支持单点修改
#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 ...
随机推荐
- QQ微信刷屏助手 FlashScreenAssist 1.2发布
主要功能 文字刷屏 图片刷屏 简易教程 文字刷屏 打开软件之后输入要刷屏的文字,点击[开始],然后点一下微信或者QQ的输入框,就会开始刷屏了,注意[时间间隔]不要调太小,越小越快. 要注意的是.必须在 ...
- cocoapods 删除已导入项目的第三方库和移除项目中的cocoapods
第一部分将介绍如何删除项目中已经由cocoapods配置好的第三方 1.打开项目中的Podfile文件 2.删除选中的pod Snapkit的命令行3.打开终端cd到当前项目的根目录下重新执行pod ...
- HTM5新手学习的一些日常总结,相互交流和相互学习。
第一天 一.HTML--网页的源码(超文本标签语言) HTML标签 标签式是HTML最基本单位和最重要的组成. 使<和>扩起来 标签都是闭合的(规范) HTML标签属性 是标签的一部分,用 ...
- Robot Framework自动化测试环境部署
文档版本:v1.0 作者:令狐冲 如有问题请发邮件到:1146009864@qq.com 使用Robot Framework框架(以下简称RF)来做自动化测试. 模块化设计 1.所需环境一览表 软件 ...
- Single Number leetcode
Given an array of integers, every element appears twice except for one. Find that single one. Note:Y ...
- React 入门之路(1)
React React简介 是由Facebook公司推广的一套框架,已经应用instagram等产品 React就是为了提供应用程序性能而设计的一套框架 在angular中,对dom提供了一些指令,让 ...
- Markdown语法讲解及MWeb使用教程
写了一个月的博客,忽然感觉Markdown编辑器比较好用,于是就下载了一个本地的Markdown编辑软件学习了一下,刚好软件里自带了一篇英文的指示文档,顺便翻译了一下,通过这个过程也大致熟悉了Mark ...
- javascript 随机显示指定内容
今天碰到一个需求,一个页面显示赞助厂商的信息,但是厂商要求排序要随机排,因为是个静态页面不是读取数据库的,所以打算用js来控制 var arr = new Array('张三', '李四', '王五' ...
- 分享一些自己写的前端库,并骗骗 star(库都是在实际项目中大量运用过的)
最近一两年在一些项目上,通过实际需求出发,编写了一些库在项目中使用,现在将这些项目都稍微整理了一下开源了出来,也许也有刚好能够你也用得上的,顺便也骗一下star.均在项目的README中加了相关的说明 ...
- iOS开发之单例模式
1.概述 单例模式是一种常用的软件设计模式,通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源. 如果希望系统中某个类的对象只能存在一个,单例模 ...