ACM-ICPC 2018 沈阳赛区网络预赛 E. The cake is a lie(最小圆覆盖至少m个点)
Educational Codeforces Round 16 F - String Set Queries (CDQ分治+AC自动机)

The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online B Red Black Tree (LCA)

zjhl2 posted @ 2018年9月17日 06:10 in with tags 二分 树链剖分 , 663 阅读

题目链接:

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5807

 

题意:

给一棵n个节点的红黑树,每条边有距离。树上有m个点是红的,每个红点的cost是0,每个黑点的cost是离它最近的红点祖先到它的距离。

q个询问,每次给k个点,现在允许你将树上某个点变红,是这k个点的cost的最大值最小,输出这个值。(数据规模都是10w)

 

思路1:

把每个红点与它父亲断开,这样就有很多棵根节点红色其他节点黑色的树(红根树)。

每次询问k个点,我们只需要考虑它们所在的红根树当中,max(cost)最大和次大的两棵树。

现在要选某个点变红,肯定是选在最大的红根树里。将max(cost)最小化后,和次大的树比一下就行了。

问题转化成,在红根树里选一个点变红,使k'个点的max(cost)最小。那就把k'个点按cost从小到大排序,求k'个后缀LCA就行了。

(可惜比赛的时候一句话写错了,搞半天还以为思路错了)

复杂度:O(n*log(n))

 

思路2:

二分答案,不满足答案的LCA合并起来再看是否满足。(大家基本是这么做的)

复杂度:O(n*log(1e14)*log(n))     但是树链剖分求LCA实在是太快了,也能过

求LCA的地方还可以转RMQ用ST表做到O(1),就是写起来比较麻烦

(试了下倍增求LCA,T掉了,果然树剖大法好!)

 

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter