博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1166
阅读量:6166 次
发布时间:2019-06-21

本文共 1556 字,大约阅读时间需要 5 分钟。

  这是一道线段树的入门题,用于学习基本的线段树的建树、更新、访问的操作。只在这里说说基本的操作。

  首先是建树(void build(int root,int le,int ri)),采用递归的方式:root为当前节点,le为区间的左端点,ri为区间的右端点;如果le==ri,说明此时长度为1,建到最底层了,所以返回;否则,建立左子树和右子树,显然左子树在数组中的下标为2*root,右子树为2*root+1,这时还要将区间一分为二,左子树负责[le,(le+ri)/2]的部分,右子树负责[(le+ri)/2+1,ri]的部分。另外一个操作是更新(void fix(int root,int le,int ri,int val)),同样采用递归的方式,当le>camp[root].right或ri<camp[root].left,说明当前节点负责的区间不是需要更新的区间,返回。显然只有当le<=camp[root].left且ri>=camp[root].right的时候当前节点负责的区间才是需要更新区间的子集,于是更新当前节点,然后更新其左子树和右子树。访问操作因题而异,这道题里如果当前区间是需要查询区间的子集,就返回节点存储的val。

#include
#include
#include
#define MAX_CAMP 50005#define MAX_LINE 115char *query="Query",*add="Add",*sub="Sub",*end="End";struct segTree{ int left; int right; int val;}camp[4*MAX_CAMP];void build(int,int,int),fix(int,int,int,int);int query_sum(int,int,int),sum=0,n;int main(){ int t,i; scanf("%d",&t); for(i=1;i<=t;i++) { int j; scanf("%d",&n); memset(camp,0,sizeof(camp)); build(1,1,n); for(j=0;j
ri) return ; camp[root].left=le; camp[root].right=ri; if(le==ri) return ; int mid=(ri+le)/2; build(root*2,le,mid); build(root*2+1,mid+1,ri);}void fix(int root,int le,int ri,int val){ if(le<=camp[root].left&&ri>=camp[root].right) { camp[root].val+=val; return ; } if(le>camp[root].right||ri
=camp[root].right) { return camp[root].val; } if(le>camp[root].right||ri

转载于:https://www.cnblogs.com/coredux/archive/2012/08/06/2624751.html

你可能感兴趣的文章
【云宏大讲坛】超融合,融合的不仅是基础架构
查看>>
pytnon入门的一些小实例
查看>>
ubuntu下的dock工具
查看>>
饿了么被上海市市场监督局予以警告处分
查看>>
Java项目读取配置文件时,找不到指定的文件???
查看>>
lua/luajit and tcc
查看>>
前端安全即JS代码安全,前端源码安全探讨!
查看>>
如何快速实现异地不同网络打印机共享
查看>>
openinstall免费服务对App推广有哪些作用?
查看>>
基于Docker的微服务CI CD流水线
查看>>
学好SEO需要掌握哪些知识要点?
查看>>
JetBrains GoLand macv2019.1.2中文版如何换成无牵引模式?
查看>>
电气火灾监控系统工作原理
查看>>
中使馆驳斥《金融时报》“中国网络威胁论”
查看>>
【挨踢人物传】茶乡浪子:“传奇”职场路,一生感谢情(第12期)
查看>>
我的友情链接
查看>>
c#关于数据库连接操作的案例
查看>>
聊聊最近接触的媒体查询!
查看>>
HAproxy指南之haproxy重定向应用(案例篇)
查看>>
学习 HTTP协议挺不错的一个类
查看>>