首页 > 编程语言 >通关基本算法 day_06 -- 差分

通关基本算法 day_06 -- 差分

时间:2022-09-24 18:11:06浏览次数:76  
标签:y2 06 y1 -- int x2 x1 day 1000

差分

原理

差分是前缀和的逆运算

给定一个 长度为 n 的a 数组,构造一个 b 数组,使得:
$$
a_i=b_1+b_2+b_3+...+b_i\
b_1=a_1\
b_2=a_2-a_1\
b_n=a_n-a_{n-1}
$$

b就称为 a 的差分,a就称为b的前缀和

模板

给区间[l, r]中的每个数加上c:B[l] += c, B[r + 1] -= c

练习

797. 差分 - AcWing题库

输入一个长度为 n 的整数序列。

接下来输入 m 个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r][l,r] 之间的每个数加上 c。

请你输出进行完所有操作后的序列。

输入格式

第一行包含两个整数 n 和 m。

第二行包含 n 个整数,表示整数序列。

接下来 m 行,每行包含三个整数 l,r,c,表示一个操作。

输出格式

共一行,包含 n 个整数,表示最终序列。

数据范围

1≤n,m≤100000
1≤l≤r≤n
−1000≤c≤1000
−1000≤整数序列中元素的值≤1000

输入样例:

6 3
1 2 2 1 2 1
1 3 1
3 5 1
1 6 1

输出样例:

3 4 5 3 4 2
#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)
{
    b[l]+=c;
    b[r+1]-=c;
}

int main()
{
    scanf("%d%d",&n,&m);
    
    for(int i = 1;i <= n;i++)
    {
        scanf("%d",&a[i]);
    }
    
    for(int i = 1;i <= n;i++)
    {
        insert(i,i,a[i]);
    }
    
    while(m--)
    {
        int l,r,c;
        scanf("%d%d%d",&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++)
    {
        printf("%d ",b[i]);
    }
    
    return 0;
}

二维差分

原理

$$
b[x_1][y_1]+=c\
b[x_2+1][y_1]-=c\
b[x1][y2+1]-=c\
b[x_2+1][y_2+1]+=c\
b[i][j] 记录的就是和相邻元素的差
$$

模板

给以(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

练习

798. 差分矩阵 - AcWing题库

输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c,其中 (x1,y1)和 (x2,y2) 表示一个子矩阵的左上角坐标和右下角坐标。

每个操作都要将选中的子矩阵中的每个元素的值加上 cc。

请你将进行完所有操作后的矩阵输出。

输入格式

第一行包含整数 n,m,q。

接下来 n行,每行包含 m 个整数,表示整数矩阵。

接下来 q 行,每行包含 5 个整数 x1,y1,x2,y2,c,表示一个操作。

输出格式

共 n 行,每行 m 个整数,表示所有操作进行完毕后的最终矩阵。

数据范围

1≤n,m≤1000
1≤q≤100000
1≤x1≤x2≤n
1≤y1≤y2≤m
−1000≤c≤1000
−1000≤矩阵内元素的值≤100−1000≤矩阵内元素的值≤1000

输入样例:

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

输出样例:

2 3 4 1
4 3 4 1
2 2 2 2
#include<iostream>

using namespace std;

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

void insert(int x1,int x2,int y1,int y2,int c)
{
    b[x1][y1]+=c;
    b[x2+1][y1]-=c;
    b[x1][y2+1]-=c;
    b[x2+1][y2+1]+=c;
}

int main()
{
    scanf("%d%d%d",&n,&m,&q);
    
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= m;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= m;j++)
        {
            insert(i,i,j,j,a[i][j]);
        }
    }
    
    while(q--)
    {
        int x1,y1,x2,y2,c;
        
        scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&c);
        
        insert(x1,x2,y1,y2,c);
    }
    
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= m;j++)
        {
            b[i][j] += b[i-1][j] + b[i][j-1] - b[i-1][j-1];
        }
    }
    
    for(int i = 1;i <= n;i++)
    {
        for(int j = 1;j <= m;j++)
        {
            printf("%d ",b[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

标签:y2,06,y1,--,int,x2,x1,day,1000
From: https://www.cnblogs.com/ShibuyaKanon/p/16726142.html

相关文章

  • NLP之基于BERT的预测掩码标记和句间关系判断
    BERT@目录BERT程序步骤程序步骤设置基本变量值,数据预处理构建输入样本在样本集中随机选取a和b两个句子把ab两个句子合并为1个模型输入句,在句首加入分类符CLS,在a......
  • 装机记录
    2022年9月想自己组装台主机,说搞就搞,过程中有一些坑,也有些收获个人纪录下。配置清单:机箱:爱国者A15122.55元主板:B660M-E(主板cpu套装1919.55元)CPU:12400F内存:金士顿......
  • iota
    iota是一个常量计数器,只能在常量的表达式中使用,iota可理解为const语句块中的行索引。const中每新增一行常量声明将使iota计数一次,默认为0第二行为1第三行为2以此类推c......
  • 性能测试之jvm
    浅谈一下在性能测试中,遇到java应用出现OOM时(内存泄漏,FGC),作为非专业java开发的测试人员如何去分析,以及调试jvm参数。在开始进行测试前,先对jvm内存分配有一个大概的了解.......
  • 点击事件和路由跳转
     工作常用的点击事件1.@click="goDetail"2.在方法中使用 methods:{//跳转到登录页   goDetail(){     this.$router.push("/login")   ......
  • JavaScript 弹窗
    JavaScript中有三种消息框:警告框、确认框、提示框警告框:用于确保用户可以得到某些信息语法:window.alert("****");确认框:用于验证是否接受用户操作语法:window.con......
  • JavaWeb---MVC : Model(模型)、View(视图)、Controller(控制器)
    博客参考:https://blog.csdn.net/jsdoulaoula/article/details/125648785?spm=1001.2014.3001.5502 《构造》    《耦合/依赖》    这个就是层与层之......
  • 94-1. Hive的企业最佳实践_ev
      hive定义             sql中解析json的用法    sql中用脚本 ......
  • 游戏的AI类型
    以下为AIForGames书中内容的归纳总结​ 游戏开发中设计的AI和AI学者研究的AI是有区别。游戏的AI包括部分借鉴技术(特定的解决方案和使游戏更加简练的效果)、启发式方法(仅......
  • docker-compose up -d启动镜像报错端口被占用
    Errorresponsefromdaemon:driverfailedprogrammingexternalconnectivityonendpointxxx:Bindfor0.0.0.0:9005failed:portisalreadyallocated报错显示端......