acwing:差分

一.差分的定义

        差分又名差分函数或差分运算,差分的结果反映了离散量之间的一种变化,是研究离散数学的一种工具。

二.差分运算

        对于差分的运算,其实就是对于前缀和的逆运算。就像高等数学上,微分和积分的关系是一样的。

三.代码示例(以及思路讲解)

​
//一维差分
# include <iostream>

using namespace std;

const int N = 100010;
int n,m;
int a[N],b[N];

void insert(int l , int r , int c)
{
    //保证只有在[l,r]范围内的数字才加上c
    b[l] += c;
    b[r + 1] -=c;
}
int main()
{
    ios::sync_with_stdio(false);// 提高代码的运行效率
    cin>>n>>m;
    for (int i = 1 ; i <= n ; ++i) cin>>a[i];
    //我们把原先的数据都初始为0,去插入输入的数据
    for (int i = 1 ; i <= n ; ++i) insert(i , i , a[i]);
    
    while (m --) //插入操作遍历m次
    {
        int l , r , c;
        cin>>l>>r>>c;
        insert(l , r , c);
    }
    for (int i = 1 ; i <= n ; ++i) b[i] += b[i - 1] //这是一个推导公式
    for (int i = 1 ; i <= n ; ++i) cout<<b[i]<<"\n";
    return 0;
}

​

四.二维差分(思想类同于二维前缀和)

# include <iostream>
using namespace std;

const int N = 1010;
int n,m,q;
int a[N][N],s[N][N];

//核心代码部分
void insert (int x1 , int y1, int x2, int y2, int c)
{
    // 保证只在[x1][y1]~[x2][y2]范围内加上c
    s[x1][y1] += c;
    s[x2 + 1][y1] -= c;
    s[x1][y2 + 1] -= c;
    s[x2 + 1][y2 + 1] += c;
}
int main()
{
    ios::sync_with_stdio(false); //提高代码的运行效率    
    cin>>n>>m>>q;
    for (int i = 1 ; i <= n ; ++i)
        for (int j = 1 ; j <= m ; ++j)   
            cin>>a[i][j];
    for (int i = 1 ; i <= n ; ++i)
        for (int j = 1 ; j <= m ; ++j)
            insert(i , j , i , j , a[i][j]);
    
    while(q -- ) //循环遍历q次
    {
        int x1,y1,x2,y2,c;
        cin>>x1>>y1>>x2>>y2>>c;
        insert(x1 , y1 , x2 , y2 , c);
    }
    
    for (int i = 1 ; i <= n ; ++i)
        for (int j = 1 ; j <= m ; ++j)
            s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
    //格式一般要求
    for (int i = 1 ; i <= n ; ++i)
    {    
        for (int j = 1 ; j <= m ; ++j)
            cout<<s[i][j]<<" ";
        cout<<"\n";

    }
    /*格式严格要求
    for (int i = 1 ; i <= n ; ++i)
    {
        for (int j = 1 ; j <= m - 1 ; ++j)
            cout<<s[i][j]<<" ";
        cout<<s[i][m]<<"\n";
    }
    */
    return 0;
}

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值