SDOI2017 樹點塗色

2021-08-03 19:53:55 字數 2830 閱讀 1593

description

bob有一棵n個點的有根樹,其中1號點是根節點。bob在每個點上塗了顏色,並且每個點上的顏色不同。定義一條路

徑的權值是:這條路徑上的點(包括起點和終點)共有多少種不同的顏色。bob可能會進行這幾種操作:

1 x:

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

2 x y:

求x到y的路徑的權值。

3 x y:

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

bob一共會進行m次操作

input

第一行兩個數n,m。

接下來n-1行,每行兩個數a,b,表示a與b之間有一條邊。

接下來m行,表示操作,格式見題目描述

1<=n,m<=100000

output

每當出現2,3操作,輸出一行。

如果是2操作,輸出乙個數表示路徑的權值

如果是3操作,輸出乙個數表示權值的最大值

sample input

5 6

1 2

2 3

3 4

3 5

2 4 5

3 3

1 4

2 4 5

1 5

2 4 5

sample output

3 4 2 2

time limit: 10 sec memory limit: 128 mb

題解:操作一就是簡單的lct的access操作了,所以直接用access維護。

操作二就是看要查詢的節點到根節點虛邊的個數就可以了。

操作三查詢以一節點為跟的最大值,考慮如何維護最大值。經畫圖可以發現,在access時,在以所斷的連 邊的節點為根節點的子樹+1,所連的子樹權值-1,用線段樹維護max就好了。

**:

#include#include#includeusing namespace std;

const

int max_n = 100001;

const

int inf = 1e9+7;

struct node

int is_root();

}pool[max_n],*root,*null;

inline int node::is_root()

inline void node::set_son(node *son,int wh)

struct lnode

tree[max_n*4];

int point[max_n*2],nxt[max_n*2],v[max_n*2];

int deep[max_n],rank_n[max_n],end_n[max_n],top[max_n],size[max_n],fa[max_n];

int n,m,a,b,c,x,y,tot,num;

inline node *newnode()

inline void init()

inline void update(int

now)

inline void pushdown(int

now)

}inline void addedge(int x,int y)

inline void rotate(node *now)

inline void splay(node *now)

inline void build(int

now,int l,int r)

intmid=(l+r)>>1;

build(now

<<1,l,mid);

build((now

<<1)+1,mid+1,r);

update(now);

}inline void change(int

now,int l,int r,int val)

pushdown(now);

intmid=(lr+rr)>>1;

if(l<=mid) change(now

<<1,l,r,val);

if(r>mid) change((now

<<1)+1,l,r,val);

update(now);

}inline int query_max(int

now,int l,int r)

inline int squery(int x,int y)

inline void dfs1(int

now,int f)

}inline void dfs2(int

now,int tip)

int mson=0;

for(int i=point[now]; i!=-1; i=nxt[i])

if(size[v[i]]now] && size[v[i]]>size[mson]) mson=v[i];

dfs2(mson,tip);

end_n[now]=end_n[mson];

for(int i=point[now]; i!=-1; i=nxt[i])

if(size[v[i]]now] && v[i]!=mson)

}inline int find_min(node *now)

inline node *access(node *now)

return y;

}inline int work(int x)

return ans;

}inline int read()

int main()

if(c==2)

if(c==3)

}return 0;

}

SDOI2017 樹點塗色

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

SDOI2017 樹點塗色

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

SDOI2017 樹點塗色

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