SDOI2017 樹點塗色

2021-10-01 10:51:17 字數 2815 閱讀 3869

題目鏈結

有三種操作,

1.把點 x

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

2.求 x

xx 到 y

yy 的路徑的上的不同顏色數。

3.在以x

xx為根的子樹中選擇乙個點,使得這個點到根節點的路徑的不同顏色數最大,求最大權值。

可以發現修改操作的乙個性質:每種顏色的節點一定會形成一條鏈。

利用lct的性質,考慮一次access實際是將某個點與根的路徑打通,對應操作1,而乙個點到根路徑上虛邊的數量+1對應它到根的顏色數,這個顏色數在splay的時候維護一下就行了。

用d ep

[x

]dep[x]

dep[x]

表示x

xx到根的顏色數,可以發現操作2的答案是dep

[x]+

dep[

y]−2

∗dep

[lca

dep[x]+dep[y]-2*dep[lca

dep[x]

+dep

[y]−

2∗de

p[lc

ax,y]+1

]+1]+

1。考慮操作3,其實就是子樹求dep

depde

p最大值,套乙個樹剖就好了。

由於lct只是用於提取路徑,所以沒有make_root操作,不用打翻轉標記。

#include

#include

#include

#define n 100010

using

namespace std;

int nxt[n<<1]

,to[n<<1]

,head[n]

,cnt;

void

add(

int u,

int v)

int siz[n]

,dep[n]

,id[n]

,nid[n]

,n,tot;

struct seg_tree

void

change

(int u,

int l,

int r,

int l,

int r,

int v)

int mid=

(l+r)

>>1;

push_down

(u);

if(l<=mid)

change

(u<<

1,l,mid,l,r,v);if

(r>mid)

change

(u<<1|

1,mid+

1,r,l,r,v)

; val[u]

=max

(val[u<<1]

,val[u<<1|

1]);

}void

build

(int u,

int l,

int r)

int mid=

(l+r)

>>1;

build

(u<<

1,l,mid)

;build

(u<<1|

1,mid+

1,r)

; val[u]

=max

(val[u<<1]

,val[u<<1|

1]);

}int

answer

(int u,

int l,

int r,

int l,

int r)

}tr;

struct lct

// void set_tag(int u)

// void push_down(int u)

// void

rotate

(int u)

// int ton[n];

// void push_all(int u)

// void

splay

(int u)

}int

find_root

(int u)

void

access

(int u)

ch[u][1

]=x;

if(x)}}

}lct;

int son[n]

,fa[n]

,top[n]

;void

dfs1

(int u,

int f)

}void

dfs2

(int u,

int topp)

}int

lca(

int x,

int y)

if(dep[x]

>dep[y]

)swap

(x,y)

;return x;

}int

main()

dfs1(1

,0);

dfs2(1

,1);

tr.build(1

,1,n);

for(

int i=

1;i<=m;i++

)else

printf

("%d\n"

,tr.

answer(1

,1,n,id[x]

,id[x]

+siz[x]-1

));}

return0;

}

SDOI2017 樹點塗色

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

SDOI2017 樹點塗色

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

SDOI2017 樹點塗色

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