首页 > 其他分享 >差分小结

差分小结

时间:2023-07-28 17:34:19浏览次数:37  
标签:int 递推 差分 修改 压维 区间 小结

应用

区间的修改(对区间内所有元素做相同的修改)和询问

时间复杂度

修改一次区间O(1)

一维差分

D[i]为差分数组,递推公式为a[i]=a[i-1]+D[i]
区间修改需要D[L]+=n,D[R+1]-=n;

二维差分

递推公式为a[i][j]=D[i][j]+a[i-1][j]+a[i][j-1]-a[i-1][j-1]也可以直接累加

for(int i=1;i<=n;++i)
for(int j=1;j<n;++j)
D[i][j+1]+=D[i][j];
for(int j=1;j<=n;++j)
for(int i=1;i<n;++i)
D[i+1][j]+=D[i][j];

修改区间D[x1][y1]+=n;D[x2+1][y1]-=n; D[x1][y2+1]-=1;D[x2+1][y2+1]+=1;

三维差分

递推公式复杂这里直接累加

for (int i=1; i<=A; i++)
        for (int j=1; j<=B; j++)
            for (int k=1; k<C; k++)        //把x、y看成定值,累加z方向
                D[num(i,j,k+1)] += D[num(i,j,k)];
    for (int i=1; i<=A; i++)
        for (int k=1; k<=C; k++)
            for (int j=1; j<B; j++)        //把x、z看成定值,累加y方向
                D[num(i,j+1,k)] += D[num(i,j,k)];
    for (int j=1; j<=B; j++)
        for (int k=1; k<=C; k++)
            for (int i=1; i<A; i++)        //把y、z看成定值,累加x方向
                D[num(i+1,j,k)] += D[num(i,j,k)];

修改区间

for (int i=1; i<=x; i++) {     //用三维差分数组记录区间修改:有8个区间端点
        D[num(x1[i],  y1[i],  z1[i])]   += d[i];
        D[num(x2[i]+1,y1[i],  z1[i])]   -= d[i];
        D[num(x1[i],  y1[i],  z2[i]+1)] -= d[i];
        D[num(x2[i]+1,y1[i],  z2[i]+1)] += d[i];
        D[num(x1[i],  y2[i]+1,z1[i])]   -= d[i];
        D[num(x2[i]+1,y2[i]+1,z1[i])]   += d[i];
        D[num(x1[i],  y2[i]+1,z2[i]+1)] += d[i];
        D[num(x2[i]+1,y2[i]+1,z2[i]+1)] -= d[i];
    }

开三维数组比较占用空间,可以压维

int num(int x,int y,int z) {  
//小技巧:压维,把三维坐标(x,y,z)转为一维的((x-1)*B+(y-1))*C+(z-1)+1
    if (x>A || y>B || z>C) return 0;
    return ((x-1)*B+(y-1))*C+(z-1)+1;
}

二维数组也可以压维(x-1)*B+(y-1)+1

标签:int,递推,差分,修改,压维,区间,小结
From: https://www.cnblogs.com/LongDz/p/17588505.html

相关文章

  • 4 前缀和与差分 参考代码
    P8218[深进1.例1]求区间和数列\(\{a_n\}\)的前缀和为\(S_n=\sum_{i=1}^{n}a_i=a_1+a_2+\cdots+a_n\)则区间\([l,r]\)的区间和为\(a_l+a_{l+1}+\cdots+a_r=S_r-S_{l-1}\)预处理出前缀和,则单次区间和的查询就做到了\(O(1)\)复杂度#include<cs......
  • 图片知识点规划小结
    面向对象面向对象是一种程序设计思想,它的核心概念是“对象”。“对象”是指具有特定属性和行为的实体,能够接收消息、处理消息并返回结果。在面向对象的编程语言中,所有的程序都是由多个对象组成的。常用的dos命令Java语言的三个版本java关键字八大数据类型三种变量和常量......
  • CTF比赛中Web的php伪协议类型题小结
    php协议类型file://—访问本地文件系统http://—访问HTTP(s)网址ftp://—访问FTP(s)URLsphp://—访问各个输入/输出流(I/Ostreams)zlib://—压缩流data://—数据(RFC2397)glob://—查找匹配的文件路径模式phar://—PHP归档1.php伪协议:需要开启allo......
  • JAVA基础之I/O流小结
    程序的运行都是离不开数据,数据的读取与保存也是一项重要的基础知识,这里为了巩固一下JAVA中的I/O操作的基础知识,特总结了以下大概的知识轮廓,如下图所示:示例代码:1、文件的读写操作2、从屏幕读取或输出3、对象的序列化......
  • Android应用程序主要组件知识小结
    Android系统中通过几个主要的组件以其灵活的组织方式在方便了开发者的同时,也不失其炫丽的效果,实在是值得我不断深入了解和学习,下面的图作为近一段时间对Android组件知识的一个小结,难免有遗漏或错误之处,敬请各位不吝赐教。我觉得深刻理解和掌握这几个组件的使用方法以及相互关系,就......
  • 高精度/前缀和/差分
    高精度存储方式:整数的长度一般小于1e6大整数的每一位存储到数组里存储时低位在前,高位在后,方便进位高精度加法每一位相加Ai+Bi+t,t表示进位取值0/1,逢十进一模板://存储方式stringa,b;//a="123456"vector<int>A,B;//A=[6,5,4,3,2,1]for(inti=a.......
  • Oracle ASM 系列 小结
      在metalink上看到一篇有关ASM总结的文章,贴出来,共同学习。 一. AutomaticStorage Management(ASM)Alerts:      Alert:Queryingv$asm_fileGivesORA-15196AfterASMWasUpgradedFrom10gR2To11gR2withanAUsize>1M[ID1145365.1]      http......
  • 差分数组
    差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减。比如说,我给你输入一个数组 nums,然后又要求给区间 nums[2..6] 全部加1,再给 nums[3..9] 全部减3,再给 nums[0..4] 全部加2,再给...一通操作猛如虎,然后问你,最后 nums 数组的值是什么?常规的思路很容易,......
  • 差分
    差分是前缀和的逆运算一维数组$diff[i]$记录了$a[i]-a[i-1]$对于区间$[l,r]$同时加$w$$Diff[1]+=w$看一道例题:Code:#include<iostream>usingnamespacestd;constintN=1e7+10;intq[N],s[N];voidinsert(intl,intr,intc){ s[l]+=c; s[r+1]......
  • 二层板的射频RF信号如何控阻抗 四层板的射频RF信号如何控阻抗 射频信号是否可以不控
    来自群友的疑难杂症(加杨老师V信:PCB206可入群):二层板的射频如何走线四层板的射频如何控阻抗 射频信号是否可以不控阻抗等等 确实很多群友问PCB上面的射频走线该怎么走?比如两层板的射频走线要不要控阻抗,射频信号能不能走内层,为什么板级天线要净空等等一系列问题,这里杨老师就......