线段树的一些初级见解

本文深入解析线段树的数据结构原理,涵盖单点修改、单点查询、区间查询等核心操作,并通过实战代码示例,帮助读者掌握线段树在解决复杂数据问题中的应用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线段树,看图理解吧.自己理解自己画的.(有错请告诉我,我只是个新手)
操作:单点修改,单点查询.在这里插入图片描述
操作:区间查询:
在这里插入图片描述
建树
在这里插入图片描述
**链接:**http://acm.hdu.edu.cn/showproblem.php?pid=1166

线段树代码:

#include<bits/stdc++.h>         //HDU 1164的AC代码   敌兵布阵 
using namespace std;        //线段树--------建树get、单点查询get、单点修改get、区间查询、区间修改
#define inf 50000
int grade[inf];

struct ndoe{
	int low, high, num;                //maxn是数值 
}tree[inf<<2];           // >>1 == / 2      <<2 == *4     <<1|1 = *2+1;

int build(int root, int low, int high){                      //建树    OK 
	tree[root].low = low;
	tree[root].high = high;
	if(low == high) {                
		//到达叶子结点 
		return tree[root].num = grade[low];
	}
	int a, b, mid = (low + high)>>1;     //>>1  ==  /2;
	a = build(root<<1,low,mid);      //<<1   ==  *2; 乘2 (建左节点);            L,mid
	b = build(root<<1|1,mid+1,high);      // <<1|1   ==  *2+1; 乘2加1(建右节点)       mid,r
	return tree[root].num = a + b;   //保存根左右节点的最大值        到达叶子结点的时候,  return  grade[l]; a+b就是叶子的上一层的num; 
}

int que(int root, int low, int high){    //查询区间学生的成绩
	if(tree[root].low > high || tree[root].high < low) {      //树的左子树 -- 它的右端点的值比  查询区间的左 要小;即这颗左子树 不在查询区间内,return 0; 
		return 0;                                              //树的右子树 -- 它的左端点的值比  查询区间的右 要大,即这颗右子树 不在查询区间内,return 0;
	}                                                          //简单来说就是 去掉不在查询范围内的左右子树
	if(tree[root].low >= low && tree[root].high <= high) {                    //然后呢,找子树(该子树的左右孩子都在该区间内),return 该值;;就不用往下找了
		return tree[root].num;
	}
	int a,b,mid = (tree[root].low + tree[root].high)>>1;
	a = que(root<<1,low,high);       //访问左结点
	b = que(root<<1|1,low,high);     //访问右节点
	return a+b;                              //回溯传递num
}
                                                //单点查询 与 单点更新 有异曲同工之妙;             //二分查找 + 回溯更新 
void update(int root,int pos,int num){          // *单点更新,过程是从根开始向下找pos的结点,然后单点更改,最后往上去维护线段树 ;
	if(tree[root].low == tree[root].high){
		tree[root].num += num;                //单点查询的话  直接 return tree[root].num; 
		return;
	}
	int mid = (tree[root].low + tree[root].high)>>1; 
	if(pos <= mid){     //如果查询的位置在. 
		update(root<<1,pos,num);      //左子树,一直递归到叶子节点
	}else {
		update(root<<1|1,pos,num);   //右子树,一直递归到叶子节点
	}
	tree[root].num = tree[root<<1].num + tree[root<<1|1].num;   // <<1 == *2 ;>>1 == /2;            //单点查询的话,这一句不要 
}                                   //从叶子节点一直回溯上去更新他的父亲节点

int main() {
	int n, m;
	while(scanf("%d",&m) != EOF && m){
		for(int cc = 0;cc < m;cc++){
			scanf("%d",&n);
			memset(grade,0,sizeof(grade));
			for(int i = 1; i <= n; i++) {
				scanf("%d",&grade[i]);
			}
			build(1,1,n);           //建树  root L R 
			getchar();
			char ch[15];int title = 1;    //command
			while(scanf("%s",&ch) != '\0'){
				int a, b;
				if(title){
					printf("Case %d:\n",cc+1);title = 0;
				}
				if(ch[0] == 'Q'){
					scanf("%d%d",&a,&b);
					getchar();
					printf("%d\n",que(1,a,b));   //查找区间
				}else if(ch[0] == 'E'){
					break;
				}
				else if(ch[0] == 'S'){
					scanf("%d%d",&a,&b);
					getchar();
					update(1,a,b*-1);       //根  序号  更改的值
				}else if(ch[0] == 'A'){
					scanf("%d%d",&a,&b);
					getchar();
					update(1,a,b);       //根  序号  更改的值
				}
			}
		}
    }
	return 0;
}
内容概要:本文介绍了多种开发者工具及其对开发效率的提升作用。首先,介绍了两款集成开发环境(IDE):IntelliJ IDEA 以其智能代码补全、强大的调试工具和项目管理功能适用于Java开发者;VS Code 则凭借轻量级和多种编程语言的插件支持成为前端开发者的常用工具。其次,提到了基于 GPT-4 的智能代码生成工具 Cursor,它通过对话式编程显著提高了开发效率。接着,阐述了版本控制系统 Git 的重要性,包括记录代码修改、分支管理和协作功能。然后,介绍了 Postman 作为 API 全生命周期管理工具,可创建、测试和文档化 API,缩短前后端联调时间。再者,提到 SonarQube 这款代码质量管理工具,能自动扫描代码并检测潜在的质量问题。还介绍了 Docker 容器化工具,通过定义应用的运行环境和依赖,确保环境一致性。最后,提及了线上诊断工具 Arthas 和性能调优工具 JProfiler,分别用于生产环境排障和性能优化。 适合人群:所有希望提高开发效率的程序员,尤其是有一定开发经验的软件工程师和技术团队。 使用场景及目标:①选择合适的 IDE 提升编码速度和代码质量;②利用 AI 编程助手加快开发进程;③通过 Git 实现高效的版本控制和团队协作;④使用 Postman 管理 API 的全生命周期;⑤借助 SonarQube 提高代码质量;⑥采用 Docker 实现环境一致性;⑦运用 Arthas 和 JProfiler 进行线上诊断和性能调优。 阅读建议:根据个人或团队的需求选择适合的工具,深入理解每种工具的功能特点,并在实际开发中不断实践和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值