资源描述:
《acm大牛总结的线段树专辑,超经典的》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、【完全版】线段树很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉得当时的代码风格实在是太丑了,很多线段树的初学者可能就是看着这篇文章来练习的,如果不小心被我培养出了这么糟糕的风格,实在是过意不去,正好过几天又要给集训队讲解线段树,所以决定把这些题目重新写一遍,顺便把近年我接触到的一些新题更新上去~;并且学习了splay等更高级的数据结构后对线段树的体会有更深了一层,线段树的写法也就比以前飘逸,简洁且方便多了.在代码前先介绍一些我的线段树风格:·maxn是题目给的最大区间,而节点数要开4倍,确切
2、的来说节点数要开大于maxn的最小2x的两倍·lson和rson分辨表示结点的左儿子和右儿子,由于每次传参数的时候都固定是这几个变量,所以可以用预定于比较方便的表示·以前的写法是另外开两个个数组记录每个结点所表示的区间,其实这个区间不必保存,一边算一边传下去就行,只需要写函数的时候多两个参数,结合lson和rson的预定义可以很方便·PushUP(intrt)是把当前结点的信息更新到父结点·PushDown(intrt)是把当前结点的信息更新给儿子结点·rt表示当前子树的根(root),也就是当前所在的结点整理这些题目后我觉得线段树的题目整体上可以分成以下四个部分:·单点更新:最最基础的线
3、段树,只更新叶子节点,然后把信息用PushUP(intr)这个函数更新上来ohdu1166敌兵布阵题意:O(-1)思路:O(-1)线段树功能:update:单点增减query:区间求和?ViewCode CPP12345678910111213#include #definelsonl,m,rt<<1#definersonm+1,r,rt<<1
4、1constintmaxn=55555;intsum[maxn<<2];voidPushUP(intrt){sum[rt]=sum[rt<<1]+sum[rt<<1
5、1];}voidbuild(intl,intr,intrt){if
6、(l==r){scanf("%d",&sum[rt]);return;1415161718192021222324252627282930313233343536373839404142434445464748495051525354555657}intm=(l+r)>>1;build(lson);build(rson);PushUP(rt);}voidupdate(intp,intadd,intl,intr,intrt){if(l==r){sum[rt]+=add;return;}intm=(l+r)>>1;if(p<=m)update(p,add,lson);elseupdate(p,
7、add,rson);PushUP(rt);}intquery(intL,intR,intl,intr,intrt){if(L<=l&&r<=R){returnsum[rt];}intm=(l+r)>>1;intret=0;if(L<=m)ret+=query(L,R,lson);if(R>m)ret+=query(L,R,rson);returnret;}intmain(){intT,n;scanf("%d",&T);for(intcas=1;cas<=T;cas++){printf("Case%d:",cas);scanf("%d",&n);build(1,n,1);charop[1
8、0];while(scanf("%s",op)){if(op[0]=='E')break;inta,b;scanf("%d%d",&a,&b);if(op[0]=='Q')printf("%d",query(a,b,1,n,1));elseif(op[0]=='S')update(a,-b,1,n,1);elseupdate(a,b,1,n,1);}}58return0;}ohdu1754IHateIt题意:O(-1)思路:O(-1)线段树功能:update:单点替换query:区间最值?ViewCode CPP1234567891011121314151617181920212223
9、2425262728293031323334353637#include#includeusingnamespacestd; #definelsonl,m,rt<<1#definersonm+1,r,rt<<1
10、1constintmaxn=222222;intMAX[maxn<<2];voidPushUP(intrt){MAX[rt]=max(MAX[rt<<1],MAX[rt<<1