跳至内容
深圳市捷比信实业有限公司 · 产品选型与采购咨询联系业务人员
点火电阻捷比信 · 专业器件主题站

弹跳羊LCT

问题的含义:共有n个位置,每个位置都有一个属性k [i],这意味着第i个位置将立即转移到i + k [i](然后依次转移)。询问您从某个点开始越界的次数。并支持修改k [i]。问题解决方案:将i连接到i + k [i],如果i + k [i]超出范围,则将其连接到外部根。打听就是寻求深度。将节点张开到根之后(假设根是原始树的原始根),左侧必须比它浅(并且必须是从它到原始树根的链)(由于访问操作) )),因此左儿子的大小是其深度(根的深度为0)。实际上,我必须在半小时前写一天的LCT。如果不是因为BZOJ编译器的堆栈空间不足,它将是1A / ********************************** ************************************问题:2002用户:Lazer2001语言:C ++结果:接受TIme:1988 ms内存: 22324 kb **************************************** ******** **************** /#包括“ bits / stdc ++。h”;内联int读取(){注册int x,c; while(isspace(c = getchar()));对于(x = -48 + c; isdigit(c = getchar());(x * = 10)+ = c-48);返回x; }“ T类”模板内联T min(const T& a,const T& b){返回a“ b? a:b; }“ T类”模板内联无效交换(T& a,T& b){T c(a); a = b,b = c; } #define N 200010 class LinkCutTree {private:node struct node int siz; bool rev_flag;节点* ch [2],* fa;内联无效更新(){siz = ch [0]-” siz + ch [1]-] siz + 1; } [}],* root [N],* null; int n;内联void push_down(node *& p){if(p-“ rev_flag){swap(p-” ch [0],p-“ ch [1]);如果(p-” ch [0]!=空),则p-”等于0。 ch [0]-” rev_flag ^ = 1; if(p-” ch [1]!= null)p-” ch [1]-“ Rev_flag ^ = 1”; p-“” rev_flag = 0; }}内联节点* newnode(节点*& fa){staTIc节点* tp(池+ 1 iz); " rev_fla; t = 0秒;返回tp-“” fa = fa,tp-“” ch [0] = tp-“”。 ch [1] = null,tp ++; }#定义isroot(p)(p-“ fa == null ||(p-” Fa-“ ch [0]!= p& amp; p-” fa-“ ch [1]!= p))#定义isrs(p)(p == p-“ fa-” ch [1])内联空旋转(node * p){if(p == null || isroot (p))返回; boo l d(isrs(p));节点* par = p-“”; F A ;票面金额-“” ch [d] = p-”。 ch [! d]; if(p-“ ch [!d]!= null) ch [! d]-" fa = par; if(!isroot(par))par-“ fa-” ch [isrs(par)] = p; //! isroot(par)p-“” fa = par-“” F A ;票面金额-“” fa = p; p-“” ch [! d] = par; par-” update(); -更新 () ; } node * st [N” 1];内联void splay(node * p){if(p == null)return; //静态节点* st [N“” 1]; STAINT INT TP(0);回覆! ! ! ! int tp; st [tp = 1] = p; for(node * t = p ;! isroot(t); t = t-“ fa)st [++ tp] = t-” F A ; while(tp)push_down(St [tp-]); while(!Isroot(p)){if(isrs(p)== isrs(p-“ fa)& amp!amp ;! Isroot(p-” fa)))旋转(p-》 Fa) ;旋转(p); }}