BZOJ 2243 染色 動態樹

2021-09-07 23:10:50 字數 983 閱讀 9789

題意:一棵樹,初始時每個節點有乙個顏色。兩種操作:(1)將某條路經上的點的顏色統一修改為某個值;(2)統計某條路徑上顏色有多少段?比如11221算3段。

思路:splay節點記錄區間的左右兩側的顏色lr,該節點的顏色val以及總的段數以及標記。向上合併時根據左孩子右孩子的lr以及當前節點的val計算當前子樹的段數。修改時,[x,y],先access(x)使得x與lca在一起。然後從y向上,直到找到lca,y和lca的右子樹標記修改,lca直接修改。這裡要注意,lca的右子樹和y要判斷是不是為nullnode,在這裡wa兩個小時。。。統計答案時與修改類似。

struct node

};node a[n],*nullnode;

void pushup(node *p)

if(p->c[1]!=nullnode)

}void pushdown(node *p)

}int isroot(node *p)

node *zig(node *x)

pushup(p);

pushup(x);

}node *zag(node *x)

pushup(p);

pushup(x);

}void splay(node *x)

else

}else

}}node *access(node *x)

return p;

}int cal(int x,int y)

else

return ans;

}void color(int x,int y,int val)

else

pushup(lca);

}vectorg[n];

int n,m,c[n];

void build()

}}void init()

build();

}int main()

else

}}

bzoj 2243 染色 樹鏈剖分

首先這是個挺裸的題,由於太久沒寫剖分導致調了好久,前天調了一下午,一直查不到錯 昨晚在看春晚的時候突然靈機一動,發現合併的時候出了問題,開電腦把它a掉了 感覺自己也蠻拼的給定 一棵有n 個節點的 無根樹和 m個操作 操作有 2類 1 將節點a 到節點b 路徑上所 有點都染 成顏色c 2 詢問節點a ...

bzoj 2243 樹鏈剖分 染色

time limit 20 sec memory limit 512 mb submit 3205 solved 1238 submit status discuss 給定一棵有n個節點的無根樹和m個操作,操作有2類 1 將節點a到節點b路徑上所有點都染成顏色c 2 詢問節點a到節點b路徑上的顏色段...

bzoj2243 樹鏈剖分 染色

description 給定一棵有n個節點的無根樹和m個操作,操作有2類 1 將節點a到節點b路徑上所有點都染成顏色c 2 詢問節點a到節點b路徑上的顏色段數量 連續相同顏色被認為是同一段 如 112221 由3段組成 11 222 和 1 請你寫乙個程式依次完成這m個操作。input 第一行包含2...