SDOI2017 樹點塗色

2022-09-18 11:15:24 字數 3044 閱讀 7825

有操作:

把點 $x$ 到根節點的路徑上所有的點染上一種沒有用過的新顏色。

求 $x$ 到 $y$ 的路徑的權值。

在以 $x$ 為根的子樹中選擇乙個點,使得這個點到根節點的路徑權值最大,求最大權值。

因為觀察到乙個顏色一定是一條向根節點的鏈,也就是說一條鏈代表了乙個資訊,那麼就可以用 $lct$ 中的乙個 $splay$ 去維護一條鏈(顏色)

那麼乙個節點的「權值」即為它到根節點經過的輕邊個數,求出單點「權值」後,直接用差分即可解決操作 $2$

用樹剖可以解決,但是這樣的話連 $lct$ 都不用了,同理,想到 $dfs$ 序,在 $access$ 操作的時候刪掉一條輕邊並且增加一條輕邊,答案有修改的只有該輕邊端點包含的子樹,那麼直接線段樹修改就好了

1 #include 2 #include 3 #include 4

5#define lson root << 1

6#define rson root << 1 | 178

using

namespace

std;910

const

int maxn = 1e05 + 10;11

const

int maxm = 1e05 + 10;12

13struct

linkedforwardstar ;

1819 linkedforwardstar link[maxm << 1

];20

int head[maxn]= ;

21int size = 0;22

23void insert (int u, int

v) 29

30const

int root = 1;31

32int

deep[maxn];

33int size[maxn]= ;

34int

dfn[maxn], rank[maxn];

35int dfsord = 0;36

37int maxv[maxn << 2]= ;

38int lazy[maxn << 2]= ;

39void pushdown (int

root) 47}

48void build (int root, int left, int

right)

53int mid = (left + right) >> 1;54

build (lson, left, mid);

55 build (rson, mid + 1

, right);

56 maxv[root] =max (maxv[lson], maxv[rson]);57}

58void modify (int root, int left, int right, int l, int r, int

delta)

64pushdown (root);

65int mid = (left + right) >> 1;66

if (l <=mid)

67modify (lson, left, mid, l, r, delta);

68if (r >mid)

69 modify (rson, mid + 1

, right, l, r, delta);

70 maxv[root] =max (maxv[lson], maxv[rson]);71}

72int query (int root, int left, int right, int l, int

r) 84

85int

n, m;

8687

int father[maxn]= ;

88int son[maxn][2]= ;

89int isroot (int

p) 92

int sonbel (int

p) 95

void rotate (int

p) 106

void splay (int

p) 111

int findroot (int

p) 116

void access (int

p) 123 son[p][1] =tp;

124if (son[p][1

]) 128

}129

}130

131int ances[maxn][20

];132

void dfs (int root, int

fa)

140 size[root] = 1

;141

for (int i = head[root]; i; i =link[i].next)

149}

150151

int lca (int x, int

y) 165

return ances[fx][0

];166

}167

168int

getnum ()

179180

intmain ()

186 deep[root] = 1, dfs (root, 0

);187 build (root, 1

, n);

188for (int i = 1; i <= m; i ++)

194else

if (opt == 2

) 203

else

if (opt == 3

) 208

}209

210return0;

211}

212213

/*214

5 6215

1 2216

2 3217

3 4218

3 5219

2 4 5

2203 3

2211 4

2222 4 5

2231 5

2242 4 5

225*/

SDOI2017 樹點塗色

description bob有一棵n個點的有根樹,其中1號點是根節點。bob在每個點上塗了顏色,並且每個點上的顏色不同。定義一條路 徑的權值是 這條路徑上的點 包括起點和終點 共有多少種不同的顏色。bob可能會進行這幾種操作 1 x 把點x到根節點的路徑上所有的點染上一種沒有用過的新顏色。2 x ...

SDOI2017 樹點塗色

傳送門 塗色的操作和acc es saccess access 很像啊,如何用lct lctlc t維護這個東西呢。由於每次覆蓋的顏色都不同,且是從當前到結點覆蓋到根節點。那麼如果把顏色相同的一段維護在一條重鏈上,乙個點到根要經過多少虛邊也就包含多少顏色。所以用lct lctlc t模擬覆蓋的過程,...

SDOI2017 樹點塗色

題目鏈結 有三種操作,1.把點 x xx 到根節點的路徑上所有的點染上一種沒有用過的新顏色。2.求 x xx 到 y yy 的路徑的上的不同顏色數。3.在以x xx為根的子樹中選擇乙個點,使得這個點到根節點的路徑的不同顏色數最大,求最大權值。可以發現修改操作的乙個性質 每種顏色的節點一定會形成一條鏈...