- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
中学生论文浅谈线树的应用
浅谈线段树的应用
余岳
线段树节点上可能有许多域,通常可将它们分为以下三类:
1.结构域:维护线段树自身结构
2.答案域:表示答案
3.标记域:表示修改的效果
域的分类
要求一:标记域方便高效修改答案域 存在高效的算法update让标记更新答案。
要求二:答案域方便高效合并 存在高效的算法merge使得当前节点的答案可以由左右孩子的答案合并得到
要求三:标记域方便高效下传 存在高效的算法link计算出一个新标记mark可以完整表示经过mark1、mark2两次标记之后的效果。
对域的设计要求
Data=update(data,mark)Data’=merge(left^.data,right^.data)mark=link(mark1,mark2)
由于可以将程序的模板化,在利用线段树解题时,我们只需要讨论如何设计标记域、答案域,以及如何写出update、merge和 link 这三个函数。所以,我们要解决以下问题:
1. 需要维护哪些答案域?这些答案域能否高效合并?
2. 需要维护哪些标记域?这些标记域能否高效下传、高效更新答案域?
我们要解决的问题
题目描述:
输入两个个长为n的数列x[i],y[i],维护m个操作,操作分为三类:1.对于某一区间将其中的y[i]加到x[i]上(即x[i]+=y[i])2.对于某一区间将其中的x[i]加到y[i]上(即y[i]+=x[i])3.询问某一段中所有的x[i]*y[i]的和
要求高效地在线回答询问。
双数组问题
双数组问题
Link函数可以根据上面的示意图写出(或者用矩阵乘法)
双数组问题
双数组问题
Type datatype=record sxy,sx2,sy2:longint; end;
marktype=record a,b,c,d: longint end;
function update(data:datatype; mark:marktype):datatype;
update.sxy:=a*c*sx2+b*d*sy2+(a*d+b*c)*sxy;
update.sx2:=a*a*sx2+b*b*sy2+2*a*b*sxy;
update.sy2:=c*c*sx2+d*d*sy2+2*c*d*sxy;
function merge(a,b:datatype):datatype;
merge.sxy:=a.sxy+b.sxy;
merge.sx2:=a.sx2+b.sx2;
merge.sy2:=a.sy2+b.sy2;
function link(x,y:marktype):marktype;
link.a:=x.a*y.a+x.c*y.b;
link.b:=x.b*y.a+x.d*y.b;
link.c:=x.a*y.c+x.c*y.d;
link.d:=x.d*y.d+x.b*y.c;
输入长度为n的数列a[i]。维护m次操作,每次操作可以:1. a[l]…a[r]每一项都加一个数c2.求F[ a[l] ]+F[ a[l+1] ]+…F[ a[r] ],答案取模输出其中F[i]表示斐波那契数列。即F[0]=F[1]=1,F[n+2]=F[n+1]+F[n]。
斐波那契数列问题
斐波那契数列问题
斐波那契数列问题
斐波那契数列问题
预处理:O(nlogn) 单次询问、修改:O ((logn)2)
type datatype=record sa,sa2:longint; end;
marktype=longint;
matrix=array[1..2,1..2] of longint;
const yuan:matrix=((0,1),(1,1));
operator *(a,b:matrix)c:matrix; //矩阵乘法,略
operator **(a:matrix; b:longint)c:matrix; //矩阵快速幂,略
function update(data:datatype; mark:marktype):datatype;
tmp:=yuan**mark;
update.sa:=(data.sa*tmp[1,1]+data.sa2*tmp[1,2]) mod modular;
update.sa2:=(data.sa*tmp[2,1]+data.sa2*tmp[2,2]) mod modular;
function merge(a,b:datatype):datatype;
merge.sa:=a.sa+b.sa;
merge.sa2:=a.
文档评论(0)