有操作:
把點 $x$ 到根節點的路徑上所有的點染上一種沒有用過的新顏色。
求 $x$ 到 $y$ 的路徑的權值。
在以 $x$ 為根的子樹中選擇乙個點,使得這個點到根節點的路徑權值最大,求最大權值。
因為觀察到乙個顏色一定是一條向根節點的鏈,也就是說一條鏈代表了乙個資訊,那麼就可以用 $lct$ 中的乙個 $splay$ 去維護一條鏈(顏色)
那麼乙個節點的「權值」即為它到根節點經過的輕邊個數,求出單點「權值」後,直接用差分即可解決操作 $2$
用樹剖可以解決,但是這樣的話連 $lct$ 都不用了,同理,想到 $dfs$ 序,在 $access$ 操作的時候刪掉一條輕邊並且增加一條輕邊,答案有修改的只有該輕邊端點包含的子樹,那麼直接線段樹修改就好了
1 #include 2 #include 3 #include 45#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為根的子樹中選擇乙個點,使得這個點到根節點的路徑的不同顏色數最大,求最大權值。可以發現修改操作的乙個性質 每種顏色的節點一定會形成一條鏈...