4817 Sdoi2017 樹點塗色

2022-04-30 12:33:11 字數 2299 閱讀 1981

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

定義一條路徑的權值是:這條路徑上的點(包括起點和終點)共有多少種不同的顏色。

bob可能會進行這幾種操作:

bob一共會進行 m 次操作

第一行兩個數 n,m。

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

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

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

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

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

輸入 #1

5 6

1 22 3

3 43 5

2 4 5

3 31 4

2 4 5

1 52 4 5

輸出 #1

342

2

\(n , m <= 1e5\)

分析

將相同顏色的點看做乙個splay , 那麼操作1就是標準的access

對於操作二三維護,乙個點到根的顏色個數,也是splay的個數。

這個可以用線段樹維護

在assess操作時,將要並上去的的子樹-- , 斷開的子樹++

1.別忘了初始化,初始時各個節點顏色互不相同,也就是ans = d(到根的距離)

2.rot時分清誰和誰, 我腦殘寫了 fa[x] = y , fa[y] = x

#include#includeusing namespace std;

const int n = 210000;

inline int read()

int n , m , dfn , cnt;

int head[n] , st[n] , ed[n] , d[n] , fdfn[n] , f[n][20] , siz[n] , fa[n] , tr[n][2] , rev[n] , maxn[n<<2] , tag[n<<2];

struct edge e[n<<1];

inline void add(int u , int v)

#define d_bag puts("this is ok!!");

// segment_tree->begin()

void down(int k)

return ;

}void build(int k , int l , int r) // 建樹初始化

int mid = (l + r) >> 1;

build(k << 1 , l , mid);

build(k << 1 | 1 , mid + 1 , r);

maxn[k] = max(maxn[k<<1] , maxn[k<<1|1]);

return ;

}void change(int k , int l , int r , int x , int y , int val)

int ask(int k , int l , int r , int x , int y)

// segment_tree->end()

inline int witch(int x)

inline int nrt(int x)

void rot(int x)

void splay(int x)

return ;

}int find_son(int x)

void assess(int x)

if(tr[x][1])

tr[x][1] = t;

} return ;

}int lca(int x , int y)

void dfs(int x)

ed[x] = dfn;

return ;

}int main()

d[1] = 1; dfs(1);

build(1 , 1 , n);

for(int i = 1 , op , x ; i <= m ; ++i)

else

if(op == 3)

printf("%d\n" , ask(1 , 1 , n , st[x] , ed[x]));

} return 0;}/*

5 61 2

2 33 4

3 52 4 5

3 31 4

2 4 5

1 52 4 5

*/

Bzoj4817 SDOI2017 樹點塗色

bzoj 做個轉化 最開始都是虛邊 操作1 1 就是lc t role presentation lct lct裡的 acce ssa cc es s操作 求的就是路徑上虛邊的個數 1 然後就好辦了 用樹鏈剖分 線段樹來維護每個點到根虛邊的個數的最大值 操作1 1 access role prese...

BZOJ4817 Sdoi2017 樹點塗色

time limit 10 sec memory limit 128 mb submit 515 solved 302 submit status discuss bob有一棵n個點的有根樹,其中1號點是根節點。bob在每個點上塗了顏色,並且每個點上的顏色不同。定義一條路 徑的權值是 這條路徑上的點...

bzoj4817 SDOI2017 樹點塗色

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