树状数组的神操作QAQ
卧槽
厉害了,我的树状数组
1、单点修改,单点查询
用差分数组维护
#include<cstdio>
#include<iostream>
using namespace std;
#define int long long
#define M 1000500
#define love_nmr 0
#define lowbit(x) (x&(-x))
int c[M],flag,n,m;
inline void add(int pos,int x)
{
for(int i=pos;i<=n;i+=lowbit(i))
c[i]+=x;
}
inline int query(int x)
{
int ans=;
for(int i=x;i;i-=lowbit(i))
ans+=c[i];
return ans;
}
signed main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
int now=,last=;
for(int i=;i<=n;i++)
{
cin>>now;
add(i,now-last);
last=now;
}
int x;
for(int i=;i<=m;i++)
{
cin>>flag;
if(flag==)
{
int x,k;
cin>>x>>k;
add(x,k);
add(x+,-k);
}
else
{
cin>>x;
cout<<query(x)<<endl;
}
}
return love_nmr;
}
2、单点修改,区间查询(最原始的,最本质的)
#include<cstdio>
#include<iostream>
using namespace std;
#define N 1000050
#define int long long
#define love_nmr 0
int a[N],c[N],j;
int n,m;
inline int lowbit(int x)
{
return x&(-x);
}
inline void add(int x,int y)
{
while(x<=n)
{
c[x]+=y;
x+=lowbit(x);
}
}
inline int sum(int x)
{
int ace=;
while(x>=)
{
ace+=c[x];
x-=lowbit(x);
}
return ace;
}
signed main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
int x,y;
for(int i=;i<=n;i++)
{
cin>>a[i];
add(i,a[i]);
}
for(int i=;i<=m;i++)
{
cin>>j>>x>>y;
if(j==)
add(x,y);
else
cout<<sum(y)-sum(x-)<<endl;
}
return love_nmr; }
3、区间修改,单点查询
差分应用
#include<cstdio>
#include<iostream>
using namespace std;
#define int long long
#define M 1000500
#define love_nmr 0
#define lowbit(x) (x&(-x))
int c[M],flag,n,m;
inline void add(int pos,int x)
{
for(int i=pos;i<=n;i+=lowbit(i))
c[i]+=x;
}
inline int query(int x)
{
int ans=;
for(int i=x;i;i-=lowbit(i))
ans+=c[i];
return ans;
}
signed main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
int now=,last=;
for(int i=;i<=n;i++)
{
cin>>now;
add(i,now-last);
last=now;
}
int x;
for(int i=;i<=m;i++)
{
cin>>flag;
if(flag==)
{
int x,y,k;
cin>>x>>y>>k;
add(x,k);
add(y+,-k);
}
else
{
cin>>x;
cout<<query(x)<<endl;
}
}
return love_nmr;
}
4、区间修改,区间查询(niubilitiful)
观察式子:
a[1]+a[2]+...+a[n]
= (c[1]) + (c[1]+c[2]) + ... + (c[1]+c[2]+...+c[n])
= n*c[1] + (n-1)*c[2] +... +c[n]
= n * (c[1]+c[2]+...+c[n]) - (0*c[1]+1*c[2]+...+(n-1)*c[n]) (式子①)
那么我们就维护一个数组c2[n],其中c2[i] = (i-1)*c[i]
每当修改c的时候,就同步修改一下c2,这样复杂度就不会改变
那么
式子①
$=n*\sum{(c,n)} - \sum{(c2,n)}$
于是我们做到了在O(logN)的时间内完成一次区间和查询
#include<cstdio>
#include<iostream>
using namespace std;
#define int long long
#define M 1000500
#define love_nmr 0
#define lowbit(x) (x&(-x))
int c[M],flag,n,m;
int s[M];
inline void add(int pos,int x)
{
for(int i=pos;i<=n;i+=lowbit(i))
{
c[i]+=x;
s[i]+=(pos-)*x;
}
}
inline int queryc(int x)
{
int ans=;
for(int i=x;i;i-=lowbit(i))
ans+=c[i];
return ans;
}
inline int querys(int x)
{
int ans=;
for(int i=x;i;i-=lowbit(i))
ans+=s[i];
return ans;
}
signed main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
int now=,last=;
for(int i=;i<=n;i++)
{
cin>>now;
add(i,now-last);
last=now;
}
for(int i=;i<=m;i++)
{
cin>>flag;
if(flag==)
{
int x,y,k;
cin>>x>>y>>k;
add(x,k);
add(y+,-k);
}
else
{
int x,y;
cin>>x>>y;
int tot1=y*queryc(y)-querys(y);
int tot2=(x-)*queryc(x-)-querys(x-);
cout<<tot1-tot2<<endl;
}
}
return love_nmr;
}
一件很好的事情就是树状数组的常数比其他NlogN的数据结构小得多,实际上它的计算次数比NlogN要小很多,再加上它代码短,是OI中的利器
厉害了~~~~~
树状数组的神操作QAQ的更多相关文章
- 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树
正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...
- {POJ}{树状数组}
总结一下树状数组的题目: {POJ}{3928}{Ping Pong} 非常好的题目,要求寻找一个数组中满足A[i]<A[k]<A[j]的个数,其中i<k<j(或者相反).很巧 ...
- POJ2299Ultra-QuickSort(归并排序 + 树状数组求逆序对)
树状数组求逆序对 转载http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 转载: 树状数组,具体的说是 离散化+树 ...
- 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...
- CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组
题目链接:CF #365 (Div. 2) D - Mishka and Interesting sum 题意:给出n个数和m个询问,(1 ≤ n, m ≤ 1 000 000) ,问在每个区间里所有 ...
- CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组(转)
转载自:http://www.cnblogs.com/icode-girl/p/5744409.html 题目链接:CF #365 (Div. 2) D - Mishka and Interestin ...
- Stars(二维树状数组)
Stars Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/65536 K (Java/Others) Total Submiss ...
- luogu 4145 花神游历各国 线段树/树状数组+并查集
此题一看便是RMQ问题,但是由于开平方的特殊操作,tag操作失效 此时发现特性:sqrt最多执行6此便使值到达1/0,此时可以剪枝不进行该操作,利用并查集到达特性找根,根代表还可以进行操作的点,再利用 ...
- 牛客第二场-J-farm-二维树状数组
二维树状数组真的还挺神奇的,更新也很神奇,比如我要更新一个区域内的和,我们的更新操作是这样的 add(x1,y1,z); add(x2+1,y2+1,z); add(x1,y2+1,-z); add( ...
随机推荐
- python之路-进程
博客园 首页 新随笔 联系 管理 订阅 随笔- 31 文章- 72 评论- 115 python之路——进程 阅读目录 理论知识 操作系统背景知识 什么是进程 进程调度 进程的并发与并行 ...
- [转]阮一峰:理解RESTful架构
作者: 阮一峰 日期: 2011年9月12日 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通 ...
- 洛谷【P1619】 解一元二次方程的烦恼
我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P16 ...
- Azure CLI下载Azure Storage Container内的所有文件
在某些场景下,客户需要把Azure Storage的某一个container内的内容都下载到本地.当然采用PowerShell可以定时的进行下载的动作,但有时客户的环境是Linux或MacOS,这时需 ...
- 资料:MVC框架+SQL Server 数据集成引擎
ylbtech-资料:MVC框架+SQL Server 数据集成引擎 1.返回顶部 1. 功能特点: MVC框架耦合性低视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样 ...
- ES6学习之Class
一.定义类(ES6的类,完全可以看做是构造函数的另一种写法) class Greet { constructor(x, y) { this.x = x; this.y = y; } sayHello( ...
- 5种最流行的AI编程语言
人工智能如今正是蓬勃发展的时期,许多开发者都在跃跃欲试,如果你写想转做AI相关的开发,那么来了解更多与AI开发有关的内容吧,本文将介绍创建AI程序时可以使用的5种最佳语言. 人工智能如今正是蓬勃发展的 ...
- RStudio 断点调试 进入for循环语句调试
参考: http://www.rstudio.com/ide/docs/debugging/overview 1.进入调试模式 全选代码,点击source即可进入调试模式. 2.进入for 调试 在F ...
- 基于http的多进程并发文件服务器
1 可以掌握的知识点 (1) 线上部署时的守护应用 (2) 常规的文件操作,配置文件读取 (3) 网络编程,端口复用等文件 (4) 多进程知识 2 代码注释如下 test_httpd.h #inclu ...
- 使用CocoaLumberjack时,自定义的log文件名
CocoaLumberjack是一个功能丰富的第三方日志系统.其生成的log文件,默认是自动命名的,如果需要自定义文件名,重载两个函数即可. // Log.h#import "CocoaLu ...