把 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 否則輸出...