LCT BZOJ2759 乙個動態樹好題

2021-08-08 20:07:25 字數 1390 閱讀 6568

把 pi

設為 i 的父親,這樣會變成乙個基環森林

可以發現乙個點有解當且僅當這個店所在聯通塊存在環

對於環,可以任取一點作為根,根原本的父親看做一條特殊的邊。

那麼用lct可以維護出乙個點與這個點所在聯通塊的根的關係,也就是xi

=k×x

rt+b

,其中

k ,

b是用lct維護出的值。

那麼可以根據根與根的父親的關係求出根的值,然後就可以求出這棵基環樹上任意一點的值。

#include 

#include

#include

using namespace std;

const int n=30010,p=10007;

int inv[p+5];

struct key

friend key operator +(key a,key b)

};struct nodea[n];

inline int isl(node *x)

inline int isr(node *x)

inline void up(node *x)

if(x->ch[1])

}inline void push(node *x)

inline void rot(node *x)

void pushtop(node *x)

inline void splay(node *x)

inline void access(node *x)

inline void reverse(node *x)

int n,q,k[n],p[n],b[n];

inline char nc()

inline void rea(int &x)

inline node *root(node *x)

inline bool un(node *x,node *y)

inline int get(node *x)

int main()

else

access(a+i);

}rea(q);

while(q--)

access(a+x); splay(a+x);

int k=a[x].sum.x,b=a[x].sum.y,cur=get(rt);

if(cur<0) printf("%d\n",cur);

else

printf("%d\n",(k*cur+b)%p);

}else

}else

access(a+x); splay(a+x);

if(un(a+x,a+p[x]))

else}}

}return

0;}

2759 乙個動態樹好題

傳送門 發現當存在乙個環,就可以求出環所在聯通塊上所有點的答案 既然題目都告訴我是lct了,就想著搞一搞,用splay維護每個點對根的方程,即splay維護這顆splay中深度最深的節點對於深度最淺節點的方程 然後腦子木的以為有很多非樹邊,在 各種亂搞,各種暴力列舉想水一水 我大概是個智障 正解 邊...

Bzoj 2759 乙個動態樹好題

有n個未知數x 1.n 和n個等式組成的同餘方程組 x i k i x p i b i mod 10007 其中,k i b i x i 0,10007 z 你要應付q個事務,每個是兩種情況之一 一.詢問當前x a 的解 a a無解輸出 1 x a 有多解輸出 2 否則輸出x a 二.修改乙個等式 ...

BZOJ2759 乙個動態樹好題 LCT

zhouzhendong 有n個未知數x 1.n 和n個等式組成的同餘方程組 x i k i x p i b i mod 10007 其中,k i b i x i 0,10007 z 你要應付q個事務,每個是兩種情況之一 一.詢問當前x a 的解 a a無解輸出 1 x a 有多解輸出 2 否則輸出...