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

原创 2018年04月17日 10:30:30

正题

      该段求点看似很难,如果我们可以一次性把i到n都加上某个数就好了~~

      不难想到用差分的思想,我们每次处理一下当前这个数与前面一个数的差值,那么通过统计这个数组的前缀和就可以完成我们的操作。

      比如说我们用一个diff[i]来表示i与i-1的差值,那么p[i]=sigma(diff[j])(j=[1~n]);想想是不是。

      那么sigma这个操作我们用树状数组来维护前缀即可。

      我们给一个diff[i]+k那么就表示着给i到n都加上了k。因为差分传递的。。。。

      改段〉〉??? 不对,因为你有一个左节点(x)和一个右节点(y),你给diff[x]+k当然也要给diff[y+1]-k。因为你给y+1到n也加上了k,当然要减去。

      理解了就搞一搞树状数组维护

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

int n,m;
int 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){
		t+=tot[x]; 
		x-=lowbit(x);
	}
	return t;
}

int main(){
	scanf("%d %d",&n,&m);
	int last,x;
	scanf("%d",&last);
	add(1,last);
	for(int i=2;i<=n;i++){
		scanf("%d",&x);
		add(i,x-last);//diff数组初始化,因为是这个数和上一个数的差
		last=x;
	}
	for(int i=1;i<=m;i++){
		int t,x,y,z;
		scanf("%d %d",&t,&x);
		if(t==1) scanf("%d %d",&y,&z),add(x,z),add(y+1,-z);//x,y在这里
		else printf("%lld\n",get_tot(x));//求前缀和
	}
}

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

C语言及程序设计提高

-
  • 1970年01月01日 08:00

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

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

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

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

树状数组的改段求段详解

以下是对于如何利用树状数组进行区间修改和区间查询的简介 可以代替不需要lazy tag的线段树,且代码量和常数较小 首先你需要学会树状数组,如果不会的话以下先讲解黑匣子使用树状数组的姿势 首先定义一个...
  • qq574857122
  • qq574857122
  • 2015-07-14 13:46:50
  • 1669

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

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

【树状数组】段修改,点查询

【树状数组】段修改,点查询 利用差分,先得到一个差分序列(如:(1,2,3,5)的差分序列为(1,1,1,2)) 当[i,j]段中所有数均加上数m时,在差分序列的i位置加上m,在j+1位置减去m即可...
  • sckbaby
  • sckbaby
  • 2014-11-08 19:53:14
  • 741

树状数组 改点求段

【1】修改操作:将A[x]的值加上val; 【2】求和操作:求此时A[l..r]的和。#include #include #include #include #include #include ...
  • ACMer_AK
  • ACMer_AK
  • 2016-07-25 08:16:43
  • 247

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

正文      这题知道树状数组的肯定秒打咯~     我们首先要清楚lowbit(x)这个数组的含义,指的是,x最后的一个1及其后面的0组成的二进制数。如lowbit(1001001101100(2...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-17 10:15:47
  • 1

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

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

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

正题      第五题:种树      这题看上去很烦,实际上也很烦。。。      那么我们第一个想到的就是用堆维护最大值。      我们把多步拆成多个一步来求解,当k=1的时候,那么答案就是最大...
  • Deep_Kevin
  • Deep_Kevin
  • 2018-04-16 11:42:57
  • 4
收藏助手
不良信息举报
您举报文章:树状数组(改段求点) ,洛谷之提高历练地,提高模板-nlogn数据结构
举报原因:
原因补充:

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