传送门
对于每个点离线处理出向上走
2
i
2^i
2i班车到的最上面的点。
然后每个询问
(
u
,
v
)
(u,v)
(u,v)先把
(
u
,
v
)
(u,v)
(u,v)倍增到刚好走不到
l
c
a
lca
lca的情况(有一个点如果就是
l
c
a
lca
lca直接特判)
然后考虑最后把
(
u
′
,
v
′
)
(u',v')
(u′,v′)连起来需要走一次还是两次。
这个就是一个二维数点问题了。
用
d
f
s
dfs
dfs序求出每个点管辖的子树表示的区间。
然后对于询问
(
a
,
b
)
(a,b)
(a,b)在dfs到
a
a
a时统计
b
b
b子树的答案。
把
a
a
a子树的修改操作更新之后再统计一次
b
b
b子树的答案。
如果两次答案一样说明某个端点在
a
a
a子树中的班车对
b
b
b子树均没有影响。
这样需要走2次,否则只用走1次。
代码
2018.11.08 NOIP模拟 班车(倍增+dfs+bit)
最新推荐文章于 2019-09-24 08:57:53 发布