2759 乙個動態樹好題

2022-09-19 08:06:10 字數 2581 閱讀 9322

傳送門

發現當存在乙個環,就可以求出環所在聯通塊上所有點的答案.

既然題目都告訴我是lct了,就想著搞一搞,

用splay維護每個點對根的方程,即splay維護這顆splay中深度最深的節點對於深度最淺節點的方程

然後腦子木的以為有很多非樹邊,在**各種亂搞,,各種暴力列舉想水一水...

我大概是個智障.

正解:邊是有向的,i->p[i]

有腦子的人都會知道這是一顆基環內向樹

基環樹有個套路就是不需要換根操作,把環上一條邊拆了,其中乙個點看做根,另乙個點看做根的special_father

那麼就很好做了,splay像上面那樣維護.

link的時候如果沒聯通就直接link,否則只是把i的special_father設為p[i]

cut的時候如果是cut掉special_father.直接把special_father設為0

否則先cut成兩個聯通塊,然後找到開始的根,若根的special_father重新聯通這兩個聯通塊就把這條邊變成正常的樹邊,link起來,special_father設為0

查詢的時候,access根的special_father即可算出根的答案,再access要查詢的點即可

1

//achen

2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include

10 #include11

#define for(i,a,b) for(int i=(a);i<=(b);i++)

12#define rep(i,a,b) for(int i=(a);i>=(b);i--)

13const

int n=30000+7,p=10007

;14 typedef long

long

ll;15 typedef double

db;16

using

namespace

std;

17int n,q,inv[p+7

];18

char o[10

];19

20 templatevoid read(t &x)

2627

int ch[n][2

],p[n],sp[n],pp[n];

28#define lc ch[x][0]

29#define rc ch[x][1]

30struct

data

33 data(int k,int

b):k(k),b(b){}

34 friend data operator *(const data&a,const data&b)

37}sum[n],dt[n];

3839

int isroot(int x)

4041

void update(int x)

4243

void rotate(int

x)

5051

void splay(int

x) 57}58

59void access(int

x) 65}66

67int find_root(int

x) 73

74void lik(int x,int

y) 78

splay(x);

79 p[x]=y;80}

8182

void cut(int x,int

y) 86

int z=find_root(x);

87 lc=p[lc]=0

; 88

update(x);

89if(sp[z]&&find_root(sp[z])!=find_root(z)) 95}

9697

void exgcd(int a,int b,int &x,int &y)

99 exgcd(b,a%b,y,x); y-=a/b*x;

100}

101102

void qry(int

x) 110

int a=(1-tp.k+p)%p;

111int rs=!tp.k?tp.b:inv[a]*tp.b%p;

112access(x);

113splay(x);

114 rs=(sum[x].k*rs%p+sum[x].b)%p;

115 printf("

%d\n

",rs);

116}

117}

118119

//#define debug

120int

main()

132read(q);

133while(q--)

140else

150}

151return0;

152 }

view code

我真的好菜呀,,什麼"經典模型","套路","眾所周知的" 都不知道,什麼"大水題","送分題","普及-的題"都做不來...

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 二.修改乙個等式 ...

LCT BZOJ2759 乙個動態樹好題

把 pi 設為 i 的父親,這樣會變成乙個基環森林 可以發現乙個點有解當且僅當這個店所在聯通塊存在環 對於環,可以任取一點作為根,根原本的父親看做一條特殊的邊。那麼用lct可以維護出乙個點與這個點所在聯通塊的根的關係,也就是xi k x rt b 其中 k b是用lct維護出的值。那麼可以根據根與根...

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