題意:中文題。
思路:很好的一道樹鏈剖分。樹剖後,線段樹要記錄左端點l,右端點r,左端點的顏色lc,右端點的顏色rc,區間成段更新的標記tag,區間
有多少顏色段。區間合並的時候要注意如果左子樹的右端和右子樹的左端顏色相同那麼數量要減一。但是存在一個問題當前剖到
的鏈與上一次的鏈在相交的邊緣可能顏色相同,如果顏色相同答案需要減一。所以統計答案的時候要記錄下上一次剖到的鏈的左端
點的顏色,與當前剖到的鏈右端點的顏色(因為在處理出的線段樹中越靠近根的點位置越左),比較這兩個顏色,若相同則答案減
1。又由於有u和v兩個位置在向上走,那麼要記錄ans1,ans2兩個變量來存“上一次的左端點顏色”。有一點需要注意,當
top[u]=top[v]的時候,即已經在同一個重鏈上時,兩邊端點顏色都要考慮與對應ans比較顏色,相同答案要相應減一。詳見代碼:
/*********************************************************
file name: bzoj2243.cpp
author : kereo
create time: 2015年01月23日 星期五 09時51分17秒
*********************************************************/
#include
#include
#include
#include
#include
#include