1. 程式人生 > 實用技巧 >洛谷 P2486 [SDOI2011]染色

洛谷 P2486 [SDOI2011]染色

洛谷 P2486 [SDOI2011]染色

洛谷傳送門

題目描述

給定一棵 nn 個節點的無根樹,共有 mm 個操作,操作分為兩種:

  1. 將節點 aa 到節點 bb 的路徑上的所有點(包括 aa 和 bb)都染成顏色 cc
  2. 詢問節點 aa 到節點 bb 的路徑上的顏色段數量。

顏色段的定義是極長的連續相同顏色被認為是一段。例如 112221 由三段組成:112221

輸入格式

輸入的第一行是用空格隔開的兩個整數,分別代表樹的節點個數 nn 和操作個數 mm

第二行有 nn 個用空格隔開的整數,第 ii 個整數 w_iw**i 代表結點 ii 的初始顏色。

第 33 到第 (n + 1)(n

+1) 行,每行兩個用空格隔開的整數 u, vu,v,代表樹上存在一條連結節點 uu 和節點 vv 的邊。

第 (n + 2)(n+2) 到第 (n + m + 1)(n+m+1) 行,每行描述一個操作,其格式為:

每行首先有一個字元 opo**p,代表本次操作的型別。

  • 若 opo**pC,則代表本次操作是一次染色操作,在一個空格後有三個用空格隔開的整數 a, b, ca,b,c,代表將 aa 到 bb 的路徑上所有點都染成顏色 cc
  • 若 opo**pQ,則代表本次操作是一次查詢操作,在一個空格後有兩個用空格隔開的整數 a, ba,b,表示查詢 aa 到 bb 路徑上的顏色段數量。

輸出格式

對於每次查詢操作,輸出一行一個整數代表答案。


題解:

精髓在於線段樹維護顏色塊。

可以參考小白逛公園的維護方式,在維護答案的同時維護區間左右端點的顏色。顯然的是,在區間合併的時候,如果左兒子的右端點顏色等於右兒子的左端點顏色,那麼就需要把答案-1.

就這麼維護就好了。