树状数组(改点求段) ,洛谷之提高历练地,提高模板-nlogn数据结构

原创 2018年04月17日 10:15:47

正文

      这题知道树状数组的肯定秒打咯~

     我们首先要清楚lowbit(x)这个数组的含义,指的是,x最后的一个1及其后面的0组成的二进制数。如lowbit(1001001101100(2))=100(2)=4微笑lowbit(1010101101010000(2))=10000(2)=16;

      所以我们可以肯定的是lowbit一定是一个2的幂次方数。

      在树状数组里面表示的就是x管理着(x-lowbit(x)+1)~x这段区间的数,而掌管着他的正好就是掌管

      所以我们每次从当前的位置往上更新即可。

#include<cstdio>
#include<cstdlib>
#include<cstring>

int n,m;
long long tot[500010];

int lowbit(int x){//你没看错就是这么简单,不懂的去学学补码~
	return x&(-x);
}

void add(int x,int t){
	while(x<=n){
		tot[x]+=t;
		x+=lowbit(x);
	}
}

long long get_tot(int x){
	long long t=0;
	while(x>=1){//get的时候就直接向自己的上一棵不包含的树移动
		t+=tot[x];
		x-=lowbit(x);
	}
	return t;
}

int main(){
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++){
		int x;
		scanf("%d",&x);
		add(i,x);
	}
	for(int i=1;i<=m;i++){
		int t,x,y;
		scanf("%d %d %d",&t,&x,&y);
		if(t==1) add(x,y); 
		else printf("%lld\n",get_tot(y)-get_tot(x-1));
	}
}

版权声明: https://blog.csdn.net/Deep_Kevin/article/details/79970656

C语言及程序设计提高

本课为“C语言及程序设计”系列课程中的第二部“提高篇”。在第一部“初步篇”介绍基本的数据结构和控制结构基础上,引入函数和数组,传授模块化设计的方法,目标是使学习者有能力编制出300行左右代码的应用程序。系列课程针对没有任何程序设计基础的初学者,关注学习者能够通过实践的方式,学会利用C语言解决问题。与课程同步的实践指导,以及贯穿始终的“银行储蓄系统”,帮助初学者真正具备程序设计能力。
  • 2015年02月08日 08:06

SuperGCD,洛谷之提高历练地,数论(3-5)

前话      数论就是研究整数的理论。包括公约公倍数、质数、欧拉定理和同余方程等。正文       其实数论不止那么简单正文      第一题:SuperGCD      这一题就是很烦的代码加很烦...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-07 17:19:43
  • 17

[SDOI2009]E&D,洛谷之提高历练地,博弈论(3-6)

正题      第四题:[SDOI2009]E&amp;amp;D      这题不是如此的简单,因为它要涉及到找规律和Sg函数。      首先的,我们可以打一个表来观察之间的关系。      Sg...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-08 13:48:45
  • 14

最长公共子序列,洛谷之提高历练地,提高模板-nlogn数据结构

正题      让你用Dp做,FFT了吧。(Fast,Fast,TLE).      n的平方明显是不行的。我们来尝试一下新的方法,我们把第一个序列从1到n来编号int x; scanf(&quot;...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-17 10:57:14
  • 11

线段树(该段求段+lazy)优化,洛谷之提高历练地,提高模板-nlogn数据结构

正文      这个东西挺简单的吧,线段树就不细讲了,主要讲讲lazy。      懒嘛~      如果当前覆盖整个区间,那么我们就用lazy把它那个值记录下来,然后,如果不是完全覆盖当前区间,那么...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-17 10:47:46
  • 30

树状数组(改段求点) ,洛谷之提高历练地,提高模板-nlogn数据结构

正题      该段求点看似很难,如果我们可以一次性把i到n都加上某个数就好了~~      不难想到用差分的思想,我们每次处理一下当前这个数与前面一个数的差值,那么通过统计这个数组的前缀和就可以完成...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-17 10:30:30
  • 5

种树,洛谷之提高历练地,堆

正题      第五题:种树      这题看上去很烦,实际上也很烦。。。      那么我们第一个想到的就是用堆维护最大值。      我们把多步拆成多个一步来求解,当k=1的时候,那么答案就是最大...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-16 11:42:57
  • 5

食物链,洛谷之提高历练地,并查集

正文      第二题:食物链      这题经典啊!!!我们可以想象,如果我们可以搞一个并查集来维护x的同伙,天敌和食物就好了。      我们想到了开三倍空间来维护x的天敌,同伙和食物。     ...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-15 15:57:03
  • 17

[POI2008]BLO-Blockade,洛谷之提高历练地,强连通分量

正题      [POI2008]BLO-Blockade      这一题很神奇啊~      我们来想想两个点不能连通和强连通有什么关系。      那么其实很明显,如果当前点所遍历到的子节点不能...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-22 14:24:13
  • 8

货车运输,洛谷之提高历练地,倍增

正题       第一题:货车运输       这道题很经典啊~~       直接建立倍增关系式求LCA即可。       不妨设i的第2^j个爸爸是f[i][j],而这条路径上的最小值设为mmin...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-20 11:48:01
  • 14
收藏助手
不良信息举报
您举报文章:树状数组(改点求段) ,洛谷之提高历练地,提高模板-nlogn数据结构
举报原因:
原因补充:

(最多只允许输入30个字)