题面:从前有一个国家,国家里面的城市是树形结构的。这个国家的国王是个萝莉控,爱上了一个小恶魔。
小恶魔喜欢制造混乱,经常让国王修改城市之间的道路系统。每条道路有两种颜色,黑与白。
修改有两种,一是把城市a和b之间的道路全部翻转颜色,二是把城市a和b之间道路的相邻路翻色。
国王的萝莉女儿,WJMZBMR很关心国家道路状况,她会询问a和b之间的道路有多少是黑色的。
一开始所有道路都是白色。
分析:
第一种操作就是最简单的树链剖分。
第二种操作如果要用树链剖分,需要仔细思考。
首先,还是只能更新那logN条链,可以想到在链上打标记来表示更新了周围的点。这样做是否可行呢?
在路径的重链上,中间的点是不变的,被标记了两次,这是合法的。
考虑询问。在询问的时候,存在两个问题,1.重链的点很多,2.某个点的度数很多。这将导致复杂度变成O(n)。
需要修改标记的含义,对于2,一条边只需要一个标记的点就够了,最适合的点是这条边的父结点。
对于1,重链上中间的点是不必标记的。
综上,在一个父节点打标记表示修改了它的孩子轻边。剩下O(logN)个端点特殊处理一下,复杂不会退化。
标记区间更新点,翻转区间更新边,这个操作可以用线段树完成。(边的id用它的子结点编号,这个写着的时候挺容易出错的。
复杂度O(Qlognlogn)
/********************************************************** ------------------ ** author AbyssFish ***********************************************************/#include #include #include #include #include #include #include #include