傳送門
塗色的操作和acc
es
saccess
access
很像啊,如何用lct
lctlc
t維護這個東西呢。
由於每次覆蓋的顏色都不同,且是從當前到結點覆蓋到根節點。
那麼如果把顏色相同的一段維護在一條重鏈上,
乙個點到根要經過多少虛邊也就包含多少顏色。
所以用lct
lctlc
t模擬覆蓋的過程,用線段樹維護即可。
虛變實就是子樹減,實變虛就是子樹加。
詢問1就是val
[x]+
val[
y]−2
∗val
[lca
(x,y
)]+1
val[x]+val[y]-2*val[lca(x,y)]+1
val[x]
+val
[y]−
2∗va
l[lc
a(x,
y)]+
1,詢問3就是區間最大值。
寫的時候要想好lct
lctlc
t在原樹中的對應點。
以及初始的時候是乙個點乙個spl
ay
splay
splay。
#include
#define re register
#define cs const
using std::swap;
cs int n=
1e5+10;
int head[n]
,next[n<<1]
,v[n<<1]
,cnt=0;
int siz[n]
,dep[n]
,top[n]
,fa[n]
,son[n]
,l[n]
,r[n]
,t[n]
,tot=0;
namespace io
template
<
typename t>
inline t get()
inline
intgi()
}using io::gi;
int n,m,u,v,g,op;
namespace sgtt[n<<2]
;inline
void
pushup
(int root)
inline
void
pushnow
(int root,
int val)
inline
void
pushdown
(int root)
}inline
void
build
(int root,
int l,
int r)
build
(lc,l,mid)
,build
(rc,mid+
1,r)
,pushup
(root);}
inline
void
update
(int root,
int l,
int r,
int val)
inline
intquery_max
(int root,
int l,
int r)
inline
intval
(int root,
int pos)
#undef lc
#undef rc
#undef mid
}using sgt::val;
namespace lct
inline
intisroot
(int x)
inline
void
rotate
(int x)
inline
void
splay
(int x)
inline
intgetpos
(int x)
inline
void
access
(int x)}}
inline
void
add(
int u,
int v)
void
dfs1
(int u,
int f)
}void
dfs2
(int u,
int tp)
inline
intlca
(int u,
int v)
return
(dep[u]
)?u:v;
}int
main()
}
SDOI2017 樹點塗色
description bob有一棵n個點的有根樹,其中1號點是根節點。bob在每個點上塗了顏色,並且每個點上的顏色不同。定義一條路 徑的權值是 這條路徑上的點 包括起點和終點 共有多少種不同的顏色。bob可能會進行這幾種操作 1 x 把點x到根節點的路徑上所有的點染上一種沒有用過的新顏色。2 x ...
SDOI2017 樹點塗色
題目鏈結 有三種操作,1.把點 x xx 到根節點的路徑上所有的點染上一種沒有用過的新顏色。2.求 x xx 到 y yy 的路徑的上的不同顏色數。3.在以x xx為根的子樹中選擇乙個點,使得這個點到根節點的路徑的不同顏色數最大,求最大權值。可以發現修改操作的乙個性質 每種顏色的節點一定會形成一條鏈...
SDOI2017 樹點塗色
bob有一棵nn個點的有根樹,其中1號點是根節點。bob在每個點上塗了顏色,並且每個點上的顏色不同。定義一條路徑的權值是 這條路徑上的點 包括起點和終點 共有多少種不同的顏色。bob可能會進行這幾種操作 把點xx到根節點的路徑上所有的點染上一種沒有用過的新顏色。求xx到yy的路徑的權值。在以x為根的...