算法竞赛——进阶指南 —— acwing354. 天天爱跑步 思维+树上差分+树上子树和减法应用

本文详细解析了acwing354题目的解法,该题目是一道结合思维与树上差分技巧的算法竞赛问题。通过将观察条件转化为树上差分,利用动态线段树和线段树合并来维护,同时探讨了在空间限制下如何优化解法,提出了通过全局数组c在dfs过程中动态维护子树和的思想,巧妙地解决了负数出现的问题。
摘要由CSDN通过智能技术生成

一道比较综合的树上差分题,比较考验思维。

显然等差数列不好直接维护。

先考虑什么情况下会观察到玩家:

对于一条路径s-t

对于上升路径s->lca(s,t),上的任意一点x:

当:d[s]-d[x]=w[x] 时,这个人会被点x的观察员观察到。

这样的话,对于每个点x,我们考虑所有人的起点s,当d[s]=w[x]+d[x]时,这个学生能被x观察到。

这样就转化为了树上差分。(对于剩下的链 t -> lca(s,t) ,同理)

对于一个人的路径中:s->lca(s,t)上的点都插入一个值d[s].最后统计所有点x,这个点上等于w[x]+d[x]的值有多少个。

这里用树上差分+动态线段树+线段树合并即可维护。

但这样花费的空间是:2*n*logn  大约是2e7 ,这个空间可能不太够一般128MB最多开到3

e7,或者采用回收节点的方法把常数去掉(洛谷上看到的神奇的方法))

struct SeqTree{
    int cnt,ls[N*40],rs[N*40],Max[N*40],id[N*40],rt[N],rab[N*40],tot,top,first[N]; joker s[N<<2]; 
    
    inline void Insert(int x,int y,int op) //差分起始 
    { 
        s[++top]=(joker){first[x],y,op};
        first[x]=top; 
    }
    
    inline int New() 
    {
         if(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值