HDU 5956 ICPC-2016 沈阳 I题 树上斜率优化(”可持久化”单调队列)

本文探讨了在HDU 5956 ICPC-2016沈阳I题中如何应用斜率优化技术。初始错误认为需要使用可持久化线段树,但实际解题过程中发现只需在查询和修改时二分定位,原数组修改并记录即可。虽然可以考虑树分治,但这道题并不需要。解题策略包括只关注重心到根的链,按深度排序进行单调查询,以及处理重心以上的子树查询时采用二分法,整体思路类似CDQ分治。
摘要由CSDN通过智能技术生成

题目

题解:
斜率优化在树上,直接暴力删线段再用栈维护复杂度显然是错的。
然后以为要用可持久化线段树维护,
后来发现我sb了
只需要在查询和修改的时候二分一下修改位置,直接在原数组上修改和记录就好了
因为我们每次只修改一个点,并且只会查询上一个版本(父亲)的单调队列,类似线段树分治的情形
所以我们不用可持久化线段树维护。可以直接修改,回溯时只将当前的修改改回来

另外,看到有人用树分治的做法,这道题没有必要,但是思想是很好的
只考虑重心到根的链,重心一下的按深度排序后单调查询。
但是重心以上的子树在链上的查询需要二分,所以是nlog^2的
不过,这种思想很像cdq分治,先统计一段区间(重心到根)对子树的贡献(只考虑在此链上分界的情况),在递归统计。
是一个很好的树上解题思路

#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define repd(i,a,b) for(int i=a;i>=b;--i)
#define rvc(i,S) for(int i=0;i<(int)S.size();++i)
#define f
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值