inline bool isrt(int x){
return R(F(x))!=x&&L(F(x))!=x;
}
//举例
inline void pushup(int i){
T[i].mx=max(T[L(i)].mx,T[R(i)].mx);
T[i].mx=max(T[i].mx,T[i].v);
}
注意要维护左右两个值时 修改要先pushdown一下,例如BZOJ2243
inline void pushdown(int x){
if(T[x].rev){
T[x].rev=0,T[L(x)].rev^=1,T[R(x)].rev^=1;
Swap(L(x));Swap(R(x));
}
if(T[x].mk){
int mk=T[x].mk;
if(L(x))mark(L(x),mk);
if(R(x))mark(R(x),mk);T[x].mk=0;
}
}
inline void pushdown(int x){//一般
if(T[x].rev){
T[x].rev^=1,T[L(x)].rev^=1,T[R(x)].rev^=1;
swap(L(x),R(x));
}
}
void Pushdown(int x){
if(!isrt(x))Pushdown(F(x));
pushdown(x);
}
inline void splay(int x){
Pushdown(x);
while(!isrt(x)){
if(!isrt(F(x)))Rotate(x);
Rotate(x);
}
}
inline void access(int x){
for(int i=0;x;i=x,x=F(x))
splay(x),R(x)=i,pushup(x);
}
inline void reverse(int x){
access(x),splay(x),T[x].rev^=1;
}
inline int findrt(int x){
access(x);splay(x);
while(L(x))x=L(x);
return x;
}
inline int link(int x,int y){
if(findrt(x)==findrt(y))return -1;
reverse(x),F(x)=y;
return 0;
}
inline int cut(int x,int y){
if(findrt(x)!=findrt(y)||x==y)return -1;
reverse(x),access(y),splay(y),F(L(y))=0,L(y)=0;pushup(y);
return 0;
}
inline void access(int x){
for(int i=0;x;i=x,x=F(x)){
splay(x);
if(R(x))T[x].chain.insert(lmx(R(x))),T[x].path.insert(mx(R(x)));
if(i)T[x].chain.erase(T[x].chain.find(lmx(i))),T[x].path.erase(T[x].path.find(mx(i)));
R(x)=i,pushup(x);
}
}
inline void pushup(int x){
sz(x)=sz(L(x))+sz(R(x))+1;
S(x)=S(L(x))+S(R(x))+T[x].val;
Ls(x)=max(Ls(L(x)),S(L(x))+T[x].val+Ls(R(x)));
Rs(x)=max(Rs(R(x)),S(R(x))+T[x].val+Rs(L(x)));
ms(x)=max(max(ms(L(x)),ms(R(x))),Rs(L(x))+T[x].val+Ls(R(x)));
}
inline void pushup(int x){
T[x].sum=T[L(x)].sum+T[R(x)].sum+1;
if(L(x))Lc(x)=Lc(L(x)),T[x].sum-=(T[x].c==Rc(L(x)));else Lc(x)=C(x);
if(R(x))Rc(x)=Rc(R(x)),T[x].sum-=(T[x].c==Lc(R(x)));else Rc(x)=C(x);
}
最小生成树具有环切性质,加入一条边时删除环上最大边即可
(没有找到题…,找到了务必告诉我)
从小到大枚举最大边长,然后在这最大边长下使最小路径最大,动态最小生成树即可
维护关于删除时间的最大生成树
一个奇环的影响仅取决于环上删除时间最小的边
对于每个时刻
加入一条边时
若它为树边直接加
若形成环,则弹出删除时间最小的边,若同时为奇环,则将最小边加入集合,表示这条边存在时,图中总有奇环
(偶环不用加这条边,因为若之后加入的边与这条边形成了奇环,那么新边一定能与其他边构成奇环)
删去一条边时
若为树边直接删
若在集合中,在集合中删去
这样,在每一时刻,若集合大小为0则图为二分图
这坑以后再填吧…