hdu4897

来源:互联网 发布:厦门软件企业 编辑:程序博客网 时间:2024/04/30 04:32

题意:
有一棵n个点的树,一开始所有边都是白的。
m个操作:
1、将a,b路径上的边颜色取反
2、将与a,b路径相邻的边颜色取反
3、询问a,b路径上多少条边是黑的
定义e在路径上当e有且仅有一个端点在路径上
n,m<=100000
题解:
突然想起这道题,觉得很妙。拜陈教主orz
相邻似乎根本不可做,题解的做法是:
给每条边存0/1,每个点存0/1,一条边真正的值为边的值异或两端的值。考虑树剖维护。
1、简单线段树操作
2、将a到b的点颜色取反!!!orz
对于路径上的边,两端都被取反相当于不变。对于相邻的边,有一个端点被改变相当于取反。u=lca(a,b)。对于u到父亲的边,a重孩子到a的边,b重孩子到b的边,暴力改一下颜色就好。但这样不是只正确维护了两端在同一重链的边么?对于跨重链的边,我们在询问时暴力查两端的点的颜色计算。由于每次询问最多跨log次重链,所以不会破坏复杂度。
3、还用说么。。
引入点颜色的想法太妙了。。

0 0
原创粉丝点击