zoukankan      html  css  js  c++  java
  • 差分(深度理解)

    以前一直以为差分就是so easy

    按照前缀和直接定义差分数组为某一数列前后两项之差(请自行忽视二维

    额,结果碰上二维是就打脸了

    差分变得异常抽象

    十分不好理解,

    吼吼,我就直接说下自己的理解

    首先,差分就是个专业术语,不要想着做差(其实就是做差,但不好写代码,且十分抽象)

    我更乐意它被当成一个过程

    应该没人看到这行小字吧。。

    就是以一个自己定义的行为

    求和它有着诸如区间加法区间减法这般的性质

    试想一下,要是我们涉及多次查询,那就最好用到线段树或树状数组但不提

    但它不需要多次查询,他只是一个不用多次查询的线段树罢了

    我们可以让修改最快,查询适当慢上一点也无所谓了

    优化修改的方法有哪些啊:

    这时你肯定会大叫:懒标记(不会没学线段树吧)

    不知道也不要紧,我们不需要知道懶标记这个东西,只要知道思想即可

    思想:对于满足区间加减法的东西,我们什么时候更新,随便更换更新顺序,最后结果永远是一样的

    容易发现我们更新时涉及许多重复操作,所以,我们可以先做个标记,意思是还没更新,到最后一次操作更新答案(区间加减法的特权)

    标记就是做一件我们没打标记时做的事情,更新!!

    这时在做差分就不难了

    一维差分:懶标记就是一个ADD,在数组某处有ADD,意思是这个数包括后面的数还没更新,更新的值为ADD;

    所以我们要把区间(x,y)加上一个值k,我们就可以让x处ADD+=k,y+1处ADD-=k;这样产生的结果是,最后去除标记时,(x,y)+=k,而y后面的被另外一个ADD抵消了

    这样就实现了区间加,我们可以不另外开数组存ADD,反正是按顺序更新的,这是就变为了正常的没有ADD的代码(网上随便找)

    二维差分:ADD可以是从这个位置开始的右下所有位置都加上ADD,这样可以组合为:矩形区间和。。。。。。(1)

           也可以是从这个位置开始的右下斜线都加上ADD, 这样可以组合为:三角形(配合(1))

         当然,我们可以任意定义ADD达到不同的效果,考试时自己想

    当然,按照这个我们还可以自行搞出三维差分之类的东西

    代码就不补了,谁都会的嘛(逃

    没人看到这行小字吧。。。。

  • 相关阅读:
    navicat 连接Oracle 报错 ORA-12514 TNS:listener does not currently know of service requested in connect descriptor
    centos 安装配置 redis
    ubuntu安装keras
    VB类似的InputBox为MFC
    WPF颜色选择器
    窗口样式
    IP地址、端口号、子网掩码提交表单库
    添加自定义对话框,您的应用程序
    在c#中使用异步等待构建响应式UI
    一个通用对话框
  • 原文地址:https://www.cnblogs.com/zrqlj/p/11298861.html
Copyright © 2011-2022 走看看