首页 > 其他分享 >二维前缀和 & 二维差分

二维前缀和 & 二维差分

时间:2024-10-10 20:00:36浏览次数:9  
标签:fr 前缀 ll sum2 差分 cha2 re 二维

二维前缀和

求二维前缀和后,能够实现 \(O(1)\) 求原数组二维区间和,但是不支持修改。

ll n, m, sum2[N][N], c[N][N];

void Sum2_pre()
{
    fr(i, 1, n)
        fr(j, 1, m)
            sum2[i][j] = sum2[i-1][j] + sum2[i][j-1] - sum2[i-1][j-1] + c[i][j];
}

ll Sum2(ll x1, ll y1, ll x2, ll y2)
{
    return sum2[x2][y2] + sum2[x1-1][y1-1] - sum2[x1-1][y2] - sum2[x2][y1-1];
}

二维差分

先预处理出差分数组,之后可以实现 \(O(1)\) 原数组二维区间修改。

将差分数组还原为原数组的复杂度是 \(O(n^2)\) 的。

ll n, m, cha2[N][N], c[N][N];

void Cha2_pre() // 预处理差分数组
{
    fr(i, 1, n)
        fr(j, 1, m)
            cha2[i][j] = c[i][j] - c[i][j-1] - c[i-1][j] + c[i-1][j-1];
}

void Cha2(ll x1, ll y1, ll x2, ll y2, ll K) // 原数组二维区间修改
{
    cha2[x1][y1] += K;
    cha2[x2 + 1][y1] -= K;
    cha2[x1][y2 + 1] -= K;
    cha2[x2 + 1][y2 + 1] += K;
}

void Cha2_nxt() // 还原差分数组
{
    fr(i, 1, n)
        fr(j, 1, m)
        {
            cha2[i][j] = cha2[i-1][j] + cha2[i][j-1] - cha2[i-1][j-1] + cha2[i][j];
            c[i][j] = cha2[i][j];
        }
}


int main()
{
    n = re; m = re;
    Cha2_pre();
    fr(i, 1, 5)
    {
        ll a = re, b = re, c = re, d = re, e = re;
        Cha2(a, b, c, d, e);
    }
    Cha2_nxt();

    fr(i, 1, n)
    {
        fr(j, 1, m) W(c[i][j], ' ');
        puts("");
    }
    return 0;
}

输入

10 10
1 1 10 10 1
2 2 9 9 1
3 3 8 8 -1
4 4 7 7 2
5 5 6 6 1

输出

1 1 1 1 1 1 1 1 1 1 
1 2 2 2 2 2 2 2 2 1
1 2 1 1 1 1 1 1 2 1
1 2 1 3 3 3 3 1 2 1
1 2 1 3 4 4 3 1 2 1
1 2 1 3 4 4 3 1 2 1
1 2 1 3 3 3 3 1 2 1
1 2 1 1 1 1 1 1 2 1
1 2 2 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1 1

标签:fr,前缀,ll,sum2,差分,cha2,re,二维
From: https://www.cnblogs.com/EdisonBa/p/18457025

相关文章

  • ARC136C Circular Addition [高维前缀和]
    Description给定一个长度为\(n\)的正整数序列\(A\),求有多少对\((i,j)\)使得\(A_i+A_j\)不发生进位操作。\(A_i<10^6\)。Solution显然对于每个\(A_i\),设\(B_i=999999-A_i\),那么\(A_i\)可以和所有位上的数都小于等于\(B_i\)对应位上的数的数匹配,考虑用桶加前缀......
  • 一维数组变二维数组
    ​  前言当出现相同的参数根据另一个特定参数来改变数据改变原因 如下图出现相同的名字但是版本号不同 下拉框数据是版本号 改变版本号时候改变这一条数据所以一个大数组中分为每个对象 每个对象两个参数第一个参数:  是选中的版本号第二个参数是相同名字的......
  • 【MATLAB代码】基于RSSI的蓝牙定位程序,N个锚点、二维平面(源代码,可直接复制)
    文章目录介绍主要功能技术细节适用场景:源代码运行结果结语介绍这款基于接收信号强度指示(RSSIRSSIRSSI)原理的蓝牙定位程序专为二维平面定位设计,通过N个蓝牙锚点实现对未知位置的精准定位。程序利用信号强度衰减模型,模拟测量误差&#x......
  • Wi-Fi定位的MATLAB代码,二维环境、N个节点(附程序,可复制粘贴到MATLAB上直接运行)
    文章目录程序信息WIFI定位源代码代码运行运行方法运行结果程序信息程序结构:运行界面截图:WIFI定位Wi-Fi定位简介Wi-Fi定位是一种利用无线局域网(WLAN)信号来确定设备或用户位置的技术。它广泛应用于室内定位、资产追踪、用户行为分析等领域,具有高精度......
  • 算法修炼之路之前缀和
    目录一:一维前缀和二:二维前缀和 三:LeetCodeOJ练习  1.第一题2.第二题 3.第三题 4.第四题5.第五题6.第六题一:一维前缀和这里通过例题来引出牛客_DP34【模板】前缀和画图分析:具体代码:#include<iostream>#include<vector>usingnamespacestd;int......
  • 代码随想录算法训练营 | 背包问题 二维,背包问题 一维,416. 分割等和子集
    背包问题二维题目链接:背包问题二维文档讲解︰代码随想录(programmercarl.com)视频讲解︰背包问题二维日期:2024-10-09想法:dp[i][j],i表示需要从物品0-i中选择加入到背包中,j表示背包的容量,dp值表示最大的价值;递推公式,如果背包大小j都比此时要放的物品i的weight[i]小了,背包放不下......
  • 算法专题四: 前缀和
    目录1.前缀和2.二维前缀和3.寻找数组的中心下标4.除自身以外数组的乘积5.和为k的子数组6.和可被K整除的子数组7.连续数组8.矩阵区域和博客主页:酷酷学!!!感谢关注~1.前缀和算法思路:根据题意,创建一个前缀和数组,dp[i]=dp[i-1]+arr[i],再使用......
  • 织梦修改数据库前缀
    在织梦CMS(DedeCMS)中修改数据库表前缀是一项重要的操作,尤其是在迁移数据库或进行安全加固时。以下是详细的步骤来完成这一操作:1.修改数据库配置文件打开配置文件打开织梦CMS的数据库配置文件 include/config.inc.php。使用FTP工具或SSH连接到服务器,然后打开该文件。修......
  • 算法:前缀和算法模版
    一维前缀和题目链接:一维前缀和模版题思路分析一:暴力O(q*N)对于每一次询问,我们都可以用一个循环计算[l,r]区间内的元素和,时间复杂度,O(q*N)每一次计算一个区间都需要去循环一次,这是不是非常的麻烦呢?我们能不能想一个办法把这个某个区间的和给存起来呢?进行反复利......
  • <免费开题>基于Python二维码生成算法研究和实现|全套源码+文章lw+毕业设计+课程设计+数
    <免费开题>基于Python二维码生成算法研究和实现|全套源码+文章lw+毕业设计+课程设计+数据库+ppt摘要随着网络应用技术的普及和发展,计算机以及移动应用系统正在飞速的发展,通过互联网平台和移动端的应用技术帮助实现了智能化及数字化的管理模式,借助系统平台实现了高效便捷的管......