前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简单线段树模板[通俗易懂]

简单线段树模板[通俗易懂]

作者头像
全栈程序员站长
发布2022-09-27 10:30:17
3560
发布2022-09-27 10:30:17
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈

例如: 给你任意几个数,给定N个区间,让你求这个区间的和;简单线段树的运用,帮助我更好的理解线段树,

//线段树基本 #include<stdio.h> #define MAXN 100100 #define MINN 10000100 int num[MAXN],t[MINN]; void build(int L,int R,int d) { if(L==R) { t[d]=num[L]; return ; } else { int mid=(L+R)/2; build(L,mid,d*2); build(mid+1,R,2*d+1); } t[d]=t[2*d]+t[2*d+1];//回溯很重要容易漏 } int inqure(int L,int R,int cl,int cr,int d) { if(L==cl&&R==cr) { return t[d]; } else { int mid=(L+R)/2; if(cr<=mid) return inqure(L,mid,cl,cr,d*2); else if(cl>mid) return inqure(mid+1,R,cl,cr,d*2+1); else { return inqure(L,mid,cl,mid,d*2)+inqure(mid+1,R,mid+1,cr,d*2+1);//查找时候的判断分为三种情况,全在左面就左查,右面就右查,左右都有就两个都查然后相加; } } } int main() { int t,n,i,l,r,q; scanf(“%d”,&t); while(t–) { scanf(“%d”,&n); for(i=1;i<=n;i++) { scanf(“%d”,&num[i]); } build(1,n,1);//从父结点开始建立// scanf(“%d”,&q); for(i=1;i<=q;i++) { scanf(“%d %d”,&l,&r); int sum=inqure(1,n,l,r,1);//从树根开始查找; printf(“%d\n”,sum); } } return 0; }

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/178798.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档