差分

假设有一个数列,我们需要对数列中的一个区间加上或减去一个值,直接想到的便是对该区间进行一次循环逐项加减。 但是当请求的操作变得非常多的时候,每次请求都进行一次循环会很容易爆时间,因此我们引入了差分算法.

差分的特点就是在进行多次操作少量查询的时候可以快速得出结果。

一维差分

如果我们想将数列a[x,y]部分进行+num,只需要在 x 的差分数列b+numy+1的差分数列上-num 然后再对整个差分数列每一项求前缀和即得到结果也就是b[x] + num , b[y+1] - num

空间优化

由于我们修改区间一直在对差分数组进行操作,查询时对差分数组求前缀和

因此我们可以在输入的时候就计算出差分数组,节省一个数组的空间

int a[N], d[N];
cin >> a[0];
d[0] = a[0];
for (int i = 1; i <= n; i++)
{
    cin >> a[i];
    d[i] = a[i] - a[i-1];
}

二维差分

二维差分即对一个矩形区间进行数据操作时使用

由下图所示,如果已知原数组a,则可以求得差分数组p[x][y] = a[x][y] - a[x-1][\y] - a[x][y-1] + a[x-1][y-1]

得出差分数组之后,我们想要对原数组中的亮蓝色区域进行数据操作,则需要在(x1,y1)对差分数组+1,但是这样子操作将会影响整个蓝色区域,因此我们需要在紫色橙色区域的对应位置进行-1 操作抵消影响,由于这俩块区域有一个交错范围因此需要在红色区域的对应位置进行 +1 操作。

推导得在(x1,y1)(x2,y2)范围进行数据操作的公式为:

d[x1][y1]+val; 
d[x2+1][y1]-val;
d[x1][y2+1]-val;
d[x2+1][y2+1]+val;

输入原数组并计算差分数组

int a[N][N], d[N][N];
for (int i = 1; i <= n; i++)
{
    for (int j = 1; j <= m; j++)
    {
        cin >> a[i][j];
        d[i][j] = a[i][j] - a[i - 1][j] - a[i][j - 1] + a[i - 1][j - 1];
    }
}

区间修改

void add(int i, int j, int x, int y, int val)
{
    d[i][j] += val, d[x + 1][y + 1] += val;
    d[x + 1][j] -= val, d[i][y + 1] -= val;
}

第一节课——dfs、bfs、二分、尺取、前缀和、差分 - Virtual Judge (csgrandeur.cn)

暴力解法:

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int maxm = 1000;
int m, n;
int a[maxm][maxm] = {};
int main()
{
cin >> m >> n;
while (n--)
{
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
for (int i = x1; i <= x2; i++)
{
for (int j = y1; j <= y2; j++)
{
a[i][j]++;
}
}
}
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= m; j++)
{
cout << a[i][j] << ' ';
}
cout << endl;
}
return 0;
}

差分+前缀和

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int maxm = 1000;
int m, n;
int d[maxm][maxm],sum[maxm][maxm];
int main()
{
cin >> m >> n;
while (n--)
{
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
d[x1][y1]++;
d[x2 + 1][y2 + 1]++;
d[x2 + 1][y1]--;
d[x1][y2 + 1]--;
}

for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= m; j++)
{
sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + d[i][j];
cout << sum[i][j] << " ";
}
cout << endl;
}
return 0;
}
 

【ACM程序设计】差分的更多相关文章

  1. 西南科技大学第十一届ACM程序设计大赛发言稿

    西南科技大学第十一届ACM程序设计大赛发言稿 各位老师.志愿者及参赛选手: 大家好,我是来自计科学院卓软1301的哈特13,很荣幸今天能站在这里代表参赛选手发言. 回想起来,我参加ACM比赛已经快两年 ...

  2. 记第五届山东省ACM程序设计比赛——遗憾并非遗憾

    记第五届山东省ACM程序设计比赛 5月10日上午9点半左右,我们的队伍从学校出发,一个多小时后到达本次比赛的地点-哈尔滨工业大学. 报道,领材料,吃午饭,在哈工大的校园里逛了逛,去主楼的自习室歇息了一 ...

  3. 华南师大 2017 年 ACM 程序设计竞赛新生初赛题解

    题解 被你们虐了千百遍的题目和 OJ 也很累的,也想要休息,所以你们别想了,行行好放过它们,我们来看题解吧... A. 诡异的计数法 Description cgy 太喜欢质数了以至于他计数也需要用质 ...

  4. 第13届 广东工业大学ACM程序设计大赛 C题 平分游戏

    第13届 广东工业大学ACM程序设计大赛 C题 平分游戏 题目描述 转眼间又过了一年,又有一届的师兄师姐要毕业了. ​ 有些师兄师姐就去了景驰科技实习. 在景驰,员工是他们最宝贵的财富.只有把每一个人 ...

  5. nyoj 1238 最少换乘 (河南省第八届acm程序设计大赛)

    题目1238 题目信息 执行结果 本题排行 pid=1238" style="text-decoration:none; color:rgb(55,119,188)"&g ...

  6. 2010山东省第一届ACM程序设计竞赛

    休眠了2月了 要振作起来了!!... http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2155 因 ...

  7. UPC 2224 Boring Counting ★(山东省第四届ACM程序设计竞赛 tag:线段树)

    [题意]给定一个长度为N的数列,M个询问区间[L,R]内大于等于A小于等于B的数的个数. [题目链接]http://acm.upc.edu.cn/problem.php?id=2224 省赛的时候脑抽 ...

  8. 哈尔滨工业大学(威海)第九届ACM程序设计竞赛 Virtual Youtuber

    链接 [https://ac.nowcoder.com/acm/contest/624/G] 题意 其实题意说的辣鸡死了,没有说明确. y is the subsequences that its s ...

  9. 桂林电子科技大学第三届ACM程序设计竞赛 G 路径

    链接:https://ac.nowcoder.com/acm/contest/558/G来源:牛客网 小猫在研究树. 小猫在研究路径. 给定一棵N个点的树,每条边有边权,请你求出最长的一条路径,满足经 ...

随机推荐

  1. 请说说你对Hibernat的理解?JDBC和Hibernate各有什么优势和劣势?

    Hibernate是一个轻量级的持久层开源框架,它是连接Java应用程序和关系数据库的中间件,负责Java对象和关系数据之间的映射.Hibernate内部对JDBC API进行了封装,负责Java对象 ...

  2. java中的ThreadLocal-learning

    为什么需要ThreadLocal 多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性. 而线程安全是指 当多个线程访问某个方法时 ...

  3. 3.3转1.8V(电平转换)

  4. H5本地存储:sessionStorage和localStorage

    作者:心叶时间:2018-05-01 18:30 H5提供了二种非常好用的本地存储方法:sessionStorage和localStorage,下面分别介绍一下: 1.sessionStorage:保 ...

  5. 体温登记app开发流程

    关于体温app,比较难的是获取定位信息,剩下的就是增删改查. 设计思路:首先布局一个添加页面,给每个元件添加id,之后在获取地点的EditText获取位置信息,在添加两个布局文件,体现在一个页面里用来 ...

  6. IDEA中Tomcat找不到war包导出按钮解决办法

    解决办法 (1) 打开Idea,点击File,然后点击Project Structure-,进入项目结构 (2) 具体步骤看下图: (3) 具体步骤如下图: (4) 具体步骤如下图: (5) 问题解决 ...

  7. 【Unity原神AR开发实战 2022】下载原神模型,PMX转FBX,导入到Unity,AR设置,测试应用程序,生成应用程序

    文章目录 一.前言 二.模型下载 1.官网下载 2.模之屋官方下载 3.第三方链接 三.pmx转fbx 1.Blender插件CATS的下载与安装 2.pmx模型的导入 四.Unity开发部分 1.V ...

  8. QT 如何让release生成的EXE可在他人电脑上运行(尝试了全网的方法后,这应该能帮你解决)

    这两天,迅速上手了QT并用其基于C++编写了一个含UI的小程序 跳过中间的开发阶段 当我兴致满满的要将程序打包时,却是费尽周折,搜尽全网的关于QT的打包教程,最后都不顶用. 后面自己和队友的共同发现, ...

  9. GRPC-go版本

    GRPC-go版本 1.安装GO,protobuf 只适合有梯子的 GO的安装没必要说了 protobuf :https://github.com/protocolbuffers/protobuf/r ...

  10. NodeJs学习日报day7——简单中间件

    const express = require('express') const app = express() const mw = function(req, resp, next) { cons ...