• codeforces 1136E 线段树


    codeforces 1136E:

    题意:给你一个长度为n的序列a和长度为n-1的序列k,序列a在任何时候都满足如下性质,a[i+1]>=ai+ki,如果更新后a[i+1]<ai+ki了,那么a[i+1]=ai+ki

    现在给你q次操作

    操作1:将位置为pos的元素+x

    操作2:询问区间l,r的区间和

    题解:非常明显的线段树题,我们不好维护的是,如果更新后,当前数字变大到不满足限制条件时,我后面的元素也要做出相应的更新

    那么我们就将a序列先减去k序列,这样的a序列也是满足限制条件了,然后我们记录下k的前缀和的前缀和,避免询问时缺少k的贡献,

    数学推导如下

    序列a满足单调不减性,

    则∑ai 同样满足单调不减性,

    当我们对位置为pos的元素进行更新时,

    如果后面的元素 a[pos+R]<a[pos],则该元素要被覆盖,

    所以我们二分右端点,将区间【pos,R】覆盖为a[pos]+x即可

    为了避免重复计算ki对a的贡献所以我们覆盖区间时可以用如下技巧

    用c来记录k的前缀和的前缀和

    每次覆盖时,我们将区间【l,r】覆盖为(a[pos]+x-k[pos])*(r-l+1)+c[r+1]-c[l]

    这样就不会使得k的贡献计算错了

  • 相关阅读:
    计算机语言发展简史
    HTML—xhtml和html5
    网络协议模型【简图】
    http协议
    URL简介
    TCP协议简介
    比较浏览器的“刷新”
    loadrunner之运行方式:线程还是进程?
    LoadRunner的函数
    LoadRunner测试结果分析
  • 原文地址:https://www.cnblogs.com/buerdepepeqi/p/11536530.html
Copyright © 2020-2023  润新知