Kinetic Tournament Tree(简称 KTT),属于 Kinetic Data Structures,首次出现于 1999 年的 Data Structures for Mobile Data,用于维护连续变化的数据。更普遍地,每一个采用如下动态化策略(kinetization strategy)的结构,都可以称为 Kinetic Tournament:
structnode{intl,r;inttag;// the lazy propagation tagintk,b;// the linear functionintswc;// the time of certificate violation};vector<node>v;intIntegerPart(doublex){if(x>=0&&x<=inf)returnint(ceil(x));returninf;}voidpush_up(intrt){intmx=v[rt<<1].b>v[rt<<1|1].b?rt<<1:rt<<1|1,mi=mx^1;v[rt].k=v[mx].k,v[rt].b=v[mx].b;v[rt].swc=v[mx].k<v[mi].k?IntegerPart(1.0*(v[mx].b-v[mi].b)/(v[mi].k-v[mx].k)):inf;}voidpush_tag(intrt,intval){v[rt].tag+=val,v[rt].swc-=val,v[rt].b+=v[rt].k*val;}voidpush_down(intrt){if(v[rt].tag)push_tag(rt<<1,v[rt].tag),push_tag(rt<<1|1,v[rt].tag),v[rt].tag=0;}voidcheckswitch(intrt){if(v[rt].l==v[rt].r)return;push_down(rt);if(v[rt].swc<=0)checkswitch(rt<<1),checkswitch(rt<<1|1);push_up(rt);}voidbuild(intrt,intl,intr){v[rt].l=l,v[rt].r=r;if(l==r)returnv[rt].k=k[l],v[rt].b=b[l],void();intmid=(l+r)>>1;build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);push_up(rt);}voidTranslateLeft(intrt,intl,intr,intval){if(l<=v[rt].l&&v[rt].r<=r)returnpush_tag(rt,val),checkswitch(rt);intmid=v[rt<<1].r;push_down(rt);if(l<=mid)TranslateLeft(rt<<1,l,r,val);if(mid<r)TranslateLeft(rt<<1|1,l,r,val);push_up(rt);}intQueryMax(intrt,intl,intr){if(l<=v[rt].l&&v[rt].r<=r)returnv[rt].b;intmid=v[rt<<1].r,res=0;push_down(rt);if(l<=mid)res=max(res,QueryMax(rt<<1,l,r));if(mid<r)res=max(res,QueryMax(rt<<1|1,l,r));returnres;}
P. K. Agarwal, S. Har-Peled, and K. R. Varadarajan. Approximating extent measures of points. J. ACM, 51(4):606–635, July 2004.
J. Basch, L. J. Guibas, and J. Hershberger. Data structures for mobile data. Journal of Algorithms, 31(1):1–28, 1999.
G. Alexandron, H. Kaplan, and M. Sharir. Kinetic and dynamic data structures for convex hulls and upper envelopes. Computational Geometry, 36(2):144–158, 2007.