线段树模板

线段树是一种可以快速查询区间内的和,最小值,最大值的一种数据结构

线段树首先是一颗完美二叉树,即所有的叶子节点的深度相同,每个节点要不就是叶子节点,要不就是有两个儿子的节点,如果所给节点不够,就要补充成为完美二叉树。

完美二叉树的每层节点数都是2的n-1次方,完美二叉树的总结点个数是2的n次方减一,n为节点的深度,从一开始计数

下面的模板以线段树区间求和为例,

/*数组下标从0开始计数*/
long long data[3000000];//用于完美二叉树每个节点的值
long long arr[2100000];//存储输入的n个节点值
int t;//二叉树最下层节点的个数
void init(int temp)//初始化,得到二叉树最下层节点的个数 t 
{
	t=1;
	while(t0)
	{
		k=(k-1)/2;
		data[k]=data[2*k+1]+data[2*k+2];
	}
}
long long query(int a,int b,int k,int l,int r)//查询[a,b)在区间[l,r)的和
{
	if(r<=a||b<=l)
		return 0;
	if(a<=l&&b>=r)
		return data[k];
	long long vl=query(a,b,k*2+1,l,(l+r)/2);
	long long vr=query(a,b,k*2+2,(l+r)/2,r);
	return vl+vr;
}

调用示例为:

	init(n);//初始化 
	memset(data,0,sizeof(data));
	for(i=0;i

 

你可能感兴趣的:(数据结构)