首页 > 其他分享 >差分

差分

时间:2022-10-26 00:12:03浏览次数:36  
标签:包含 int 矩阵 整数 差分 1000

差分

一维差分

例题——差分

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

接下来输入 m 个操作,每个操作包含三个整数 l,r,c,表示将序列中 \([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 a[N], b[N];

int main(){
    int n, m;
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= n; i ++){
        scanf("%d", &a[i]);
        b[i] = a[i] - a[i - 1];     // 差分
    }
    
    while(m --){
        int l, r, c;
        scanf("%d %d %d", &l, &r, &c);
        b[l] += c;
        b[r + 1] -= c;
    }
    
    for(int i = 1; i <= n; i ++){
        a[i] = a[i - 1] + b[i];		// 前缀和 
        printf("%d ", a[i]);
    }
}

二维差分

例题——差分矩阵

输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 \(x_1,y_1,x_2,y_2,c\),

其中 \((x_1,y_1)\) 和 \((x_2,y_2)\) 表示一个子矩阵的左上角坐标和右下角坐标。

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

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

输入格式

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

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

接下来 q 行,每行包含 5 个整数 \(x_1,y_1,x_2,y_2,c\),表示一个操作。

输出格式

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

数据范围

\(1≤n,m≤1000\),
\(1≤q≤100000\),
\(1≤x_1≤x_2≤n\),
\(1≤y_1≤y_2≤m\)
\(−1000≤c≤1000\),
\(−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 a[N][N], b[N][N];

int main(){
    
    // ios::sync_with_stdio(false);
    
    int n, m, q;
    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]);
            b[i][j] = a[i][j] - a[i -1][j] - a[i][j - 1] + a[i - 1][j - 1];  // 二维差分
        }
    }
    
    while(q --){
        int x1, y1, x2, y2, c;
        scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &c);
        b[x1][y1] += c;
        b[x1][y2 + 1] -= c;
        b[x2 + 1][y1] -= c;
        b[x2 + 1][y2 + 1] += c;
    }
    
    for(int i = 1; i <= n; i ++){
        for(int j = 1; j <= m; j ++){
            a[i][j] = a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1] + b[i][j]; 	// 二维前缀和
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
}

标签:包含,int,矩阵,整数,差分,1000
From: https://www.cnblogs.com/wojiuyishui/p/16826900.html

相关文章

  • Codeforces Round #802 (Div. 2)C. Helping the Nature(差分)
    题目链接题目大意:给你一个有n个元素的数组a,你可以通过一下三种操作使数组的每一个值都为0:选择一个下标i,然后让a[1],a[2]....a[i]都减一;选择一个下标i,然后让a[i......
  • 区间问题----差分+离散化+前缀和
     《二维离散化+二维前缀和+二维双指针算法+二分+以点代二维区间》思路:首先,利用二分,将求解问题变成判断问题,二分边长关于在二维平面上的任意区域的数值问题可......
  • 二重差分
    题目链接题目大意:小明在游戏中搭建了一堵长为的城墙,墙上有个支撑点。为了知道墙是否足够坚固,小明喊来他的好朋友小刚帮助他进行测试。小刚有一种特殊的炮弹可以对墙......
  • POJ 1201 Intervals 差分约束
    ​​http://poj.org/problem?id=1201​​TLE了很久,因为用了cin.....思路和其他差分约束差不多,​​http://www.cppblog.com/menjitianya/archive/2015/11/19/212292.html​​......
  • Gym - 101147J Whistle's New Car 树上差分
    J.Whistle'sNewCartimelimitpertestmemorylimitpertestinputoutputWhistlehasboughtanewcar,whichhasaninfinitefueltankcapacity.Hediscoveredani......
  • 运用离散化缩小不必要的范围+差分:只通过对两个区间的端点进行加减操作即可使这段区间
    原题链接:https://codeforces.com/gym/403650/problem/C   题目的原意是:给定n个区间,求1-1e9这个数轴上,对于每一个数点,在给定区间上出现过的最大值一个最朴素的想法......
  • 【复习(雾)笔记】差分/树上差分
    差分/树上差分(雾)前言说实话,写这东西挺迷的,按道理说这玩意我应该会,但是做题的时候又不会,跟新学一样,就离谱。差分这东西就挺神奇的,前后加一减一就能维护区间。开始觉得......
  • 算法基础(五)| 差分算法及模板详解
    ⭐写在前面的话:本系列文章旨在复习算法刷题中常用的基础算法与数据结构,配以详细的图例解释,总结相应的代码模板,同时结合例题以达到最佳的学习效果。本专栏面向算法零基础但有......
  • 前缀和、差分
    前缀和类似于数列,s[i]=s[i-1]+a[i],  s[r]-s[l-1]等于l到r的所有项之和  求前缀和运算:constintN=1e5+10;intsum[N],a[N];//sum[i]=a[1]+a[2]+a[3]......
  • 洛谷 P3530 / bzoj2788【tarjan】【差分约束】
    判断是否有解可以使用差分约束。求解赛车手的成绩的取值可以使用Floyd。但是\(O(n^3)\)会TLE。可以先进行一次缩点。然后进行Floyd求出每一个连通块内的最长路径......