差分标记讲解

2023-05-16

引论

       维护区间信息的数据结构有很多,像线段树、树状数组等;然而线段树之类的数据结构往往要写上一段板子(尽管不是太长),但在算法竞赛中却很有可能导致我们与别人慢上那么几分钟,所以我们需要准备一种更简单实用的数据结构,前缀和、差分标记就是这样的数据结构。

正文

适用题型

      我们每次对一个区间进行加或者减,最后我们求一下每个点的值

解决方法

    差分标记其实与前缀和有着密切的关系,我们开始时有一个初始化为0的sum数组,每次我们输入一个区间a, b和要增加的值d,我们使得sum[a] + d, sum[b] - d,最后我们设一个变量res为0,for 循环遍历sum数组每次使res加上sum[i],得到的结果就是这个结点经过修改后最终得到的值

例题

例题1、Color the ball

 

题目来源:HDU 2006-12 Programming Contest

题目描述:N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色。但是N次以后lele已经忘记了第I个气球已经涂过几次颜色了,你能帮他算出每个气球被涂过几次颜色吗?

分析:差分标记的板子题

参考代码

#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

#define N 110000

int sum[N];

int main() {
    int n;
    while (scanf("%d", &n) != EOF && n) {
        memset(sum, 0, sizeof sum);
        for (int i = 0; i < n; ++i) {
            int a, b; scanf("%d%d", &a, &b);
            ++sum[a]; --sum[b + 1];
        }
        int res = 0;
        for (int i = 1; i < n; ++i) {
            res += sum[i];
            printf("%d ", res);
        }
        res += sum[n];
        printf("%d\n", res);
    }
    return 0;
}

例题2、区间  

题目来源:牛客小白月赛5

题目描述:

有一个n个元素的数组a,而他要对a[L]-a[R]进行M次操作:

        操作一:将a[L]-a[R]内的元素都加上P

        操作二:将a[L]-a[R]内的元素都减去P

最后询问a[l]-a[r]内的元素之和

分析:这个题涉及到了区间信息的修改,很容易让人想到线段树或者树状数组这类能够动态的维护区间信息的数据结构,实际上这只是一个误导。如果我们认真读题的话我们会发现我们仅仅需要查询一次(加粗体的部分),这时采用BIT或者线段树这种难写(相比于前缀和)的数据结构显然是不合适的。一种简单的方法是用差分标记记录哪些区间进行了修改,然后直接用for循环扫一遍就可以了

#include <stdio.h>
#include <string.h>

#define N 1100000

typedef long long ll;

int a[N], b[N];

int main() {
    int n, m;
    while (scanf("%d%d", &n, &m) != EOF) {
        for (int i = 1; i <= n; ++i) {
            scanf("%d", &a[i]);
        }
        memset(b, 0, sizeof(b));
        while (m--) {
            int q, l, r, p;
            scanf("%d%d%d%d", &q, &l, &r, &p);
            if (q == 1) {
                b[l] -= p; b[r + 1] += p;
            }
            else {
                b[l] += p; b[r + 1] -= p;
            }
        }
        ll res = 0, tmp = 0;
        int l, r; scanf("%d%d", &l, &r);
        for (int i = 1; i <= n; ++i) {
            tmp += b[i];
            if (l <= i && i <= r) res = res + tmp + a[i];
        }
        printf("%lld\n", res);
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

差分标记讲解 的相关文章

  • ACM题目分类

    基本算法 模拟题 xff1a UVA118 递推 xff1a 勘测 位运算 xff1a Sum AND Subarrays 快速幂 xff1a dreamstart的催促 动态规划 xff1a LCS xff1a UVA10192 动态规划
  • 简单选择排序

    与冒泡排序相反 xff0c 每次把最小的 xff08 升序 xff09 放到第一个 xff0c 共放置n 1次 include lt stdio h gt void sort int A int N for int i 61 0 i lt
  • 二叉查找树练习代码

    include lt stdio h gt include lt stdlib h gt define Element int typedef struct Node Element data struct Node left right
  • ncre不能支付

    NCRE支付的时候点击支付按钮没反应 xff0c 这是怎么回事 xff1f 这是因为浏览器把它当成垃圾网站给拦截了 xff0c 你可以换个浏览器也可以找找有没有被阻止的网页 我用的是Google的Chrome xff0c 以它为例示范一下
  • 插入排序练习代码

    include lt stdio h gt void sort int A int n int i j tmp for i 61 1 i lt n i 43 43 tmp 61 A i for j 61 i j gt 0 j if tmp
  • 希尔排序练习代码

    include lt stdio h gt void sort int A int n int i j tmp increment for increment 61 n 2 increment gt 0 increment 61 2 for
  • 二叉树、树、森林之间的转化

    树转二叉树 将孩子作为左孩子 xff0c 将第一个兄弟作为右孩子 二叉树转树 将左孩子的右孩子作为自己的孩子 森林转二叉树 与转树差不多 xff0c 唯一需要注意的是要把第二棵树的根节点作为第一棵树的一个兄弟 二叉树转森林 把右孩子断开成一
  • 最小堆练习代码

    include lt stdio h gt include lt stdlib h gt define INF 100000 define MinData 10 typedef int Element typedef struct Node
  • 不带头结点的单链表逆置操作

    reverse函数负责逆置工作 include lt stdio h gt include lt stdlib h gt typedef struct Node int data struct Node next Node List voi
  • 我的第一个Python程序

    突然想学Python了 xff0c 今天开始学习 xff0c 编出了我的第一个Python程序 calculate the area and circumference of a circle from its radius import
  • PowerShell-压缩解压缩文件

    PowerShell 压缩解压缩文件 缘起压缩文件1 调用第三方工具自带命令2 PowerShell命令压缩 解压缩文件1 PS命令解压2 Windows内置解压3 调用COM对象 附 xff1a 查看PowerShell版本方法 缘起 前
  • Python绘制五角星

    借用了turtle这一模块的帮助 import turtle turtle forward 100 turtle right 144 turtle forward 100 turtle right 144 turtle forward 10
  • 小明的调查作业(南阳理工OJ48)

    描述 小明的老师布置了一份调查作业 xff0c 小明想在学校中请一些同学一起做一项问卷调查 xff0c 聪明的小明为了实验的客观性 xff0c 想利用自己的计算机知识帮助自己 他先用计算机生成了N个1到1000之间的随机整数 xff08 0
  • 如何加快cin\cout读取数据的速度

    在使用cin cout前加上 ios sync with stdio false 这可以加快读取数据的速度 xff0c 但是有一个非常不好的副作用就是不能与scanf这类的输入输出方法混用了 xff0c 我就是因为混用结果有一个题提交了10
  • Python读写文件

    coding utf 8 向指定文件中存储指定内容 def text create name msg full path 61 name 43 39 txt 39 file 61 open full path 39 w 39 file wr
  • eclipse设置编码格式

    打开文件 xff0c 点击edit下的setCoding 如图 弹出一个对话框 xff0c 点击other 选择utf 8 先点击apply再点击OK 完成
  • Python打印九九乘法表

    打印九九乘法表 def create table for row in range 1 10 for column in range 1 row 43 1 print str row 43 39 39 43 str column 43 39
  • UVA10562解题报告

    我的GitHub地址 xff1a https github com DongChengrong ACM Program 仔细观察他给出的树 xff0c 我们可以发现这棵多叉树长得比较有特点 最上是树根 xff0c 而每一个节点只要有孩子下面
  • 实用函数之判断素数

    功能 xff1a 判断一个数是否是素数 素数概念 xff1a 只能被1和它本身整除的数 实现语言 xff1a C C 43 43 int is prime int n if n lt 61 1 return 0 int m 61 floor
  • 打不开IDLE

    我开始安装的是Python3 6 xff0c 后来发现很多库不支持3 6只支持2 7 xff0c 所以我又重装了2 7 xff0c 这时再打开IDLE就打不开了 经过我的几次努力终于找到了解决方案 将C盘 用户 xff08 user xff

随机推荐

  • Ubuntu系统中使用gdebi安装.deb文件

    传统软件套件管理工具 dpkg 定义 xff1a dpkg为 Debian 专门开发的套件管理系统 xff0c 方便软件的安装 更新及移除 首先 xff0c 要安装dpkg软件管理工具 suo span class token functi
  • IDLE设置字体大小

    点击option gt Configure 在出现的弹框里修改字体大小 xff0c 注意字体不能是楷体等与中文相关的字体 xff0c 否则点击OK无效 xff08 虽然在我电脑上确实是这样但是不知道为什么 xff0c 如果有知道的同学希望能
  • 关于递归问题的一点见解

    背景 前不久参加牛客网的有书共读活动意外的获得了一本 具体数学 xff0c 对此感谢牛客 其次领书是要条件的 xff0c 条件就是写读书笔记 搞ACM的都知道具体数学是本什么样的神书 xff08 也可能是我太弱了 xff09 xff0c 不
  • Python乱码问题

    原因 xff1a 源文件编码格式是UTF 8而Windows的编码格式是GBK xff0c 所以出现了乱码现象 解决方案一 xff1a 编码格式改成GBK就可以了 如下 第二种解决方案 coding utf 8 import sys typ
  • Python创建模块并导入

    Python创建自己的模块很方便 xff0c 所有的 py文件都被视为是一个模块 我们可以用import 文件名的方式把它导入自己的新文件 不过我们要注意创建的模块要符合命名规范 xff0c 比如首字母不能是数字等 如果首字母是数字就会出现
  • Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK

    现象 xff1a android util AndroidRuntimeException Calling startActivity from outside of an Activity context requires the FLA
  • Python查看库安装路径

    打开IDLE xff0c 输入如下两行指令 import sys print sys path 3 如下图
  • 安装pip教程

    相信在安装pip之前大家一定都安装了Python 所以我们找到Python的根目录下的Script文件夹 xff08 如果忘记了我们的安装目录可以参考文章http blog csdn net dongchengrong article de
  • pip常用指令

    安装库 xff1a pip install packageName flask 卸载库 xff1a pip uninstall packageName flask 升级库 xff1a pip install upgrade packageN
  • Python操作文件和目录

    对文件和目录进行操作是在我们开发过程中必不可少的一环 xff0c 下面是我整理的一些常用的对文件和目录进行操作的语句 xff0c 希望能帮到你 首先是导包 xff0c 导入包os xff0c import os 1 获取当前Python脚本
  • UVA227解题报告

    因为网格中存在空格所以用gets录入 xff0c 首先录入一行数据 xff0c 如果第一个字符为 39 Z 39 则break退出循环 其次是对指令的接受与处理 接受指令可以用getchar xff0c 遇到换行符跳过 处理也很简单 xff
  • win10/win11系统 如何将7-zip设置为默认软件?

    步骤 第一步 xff0c 首先下载7 zip第二步 xff0c 点击下载的7 zip安装包第三步 xff0c 进入你安装7 zip的文件夹下 xff0c 然后找到7 Zip File Manager第四步 xff0c 右键以管理员权限运行7
  • 南阳理工OJ915解题报告

    描述 Shiva得到了两个只有加号和减号的字符串 xff0c 字串长度相同 Shiva一次可以把一个加号和它相邻的减号交换 他想知道最少需要多少次操作才能把第一个字符串变换成第二个字符串 你现在要去帮助他完成那个这个问题 输入 多组测试数据
  • Color the fence

    Color the fence 时间限制 xff1a 1000 ms 内存限制 xff1a 65535 KB 难度 xff1a 2 描述 Tom has fallen in love with Mary Now Tom wants to s
  • SDUT 1008最长公共子序列

    题目链接 https acm sdut edu cn onlinejudge2 index php Home Index problemdetail pid 1008 html 分析 题目类型 xff1a 变维DP 状态定义 对于动态规划而
  • 南阳理工OJ73

    比大小 时间限制 xff1a 3000 ms 内存限制 xff1a 65535 KB 难度 xff1a 2 描述 给你两个很大的数 xff0c 你能不能判断出他们两个数的大小呢 xff1f 比如123456789123456789要大于 1
  • Unable to locate JAR/zip in file system as specified by the driver definition: mysql-connector-java-

    第一次用eclipse配置hibernate映射 xff0c 结果遇到了这种错误 怎么办 xff1f 别担心 xff0c 解决方案送上来 找到对话框里的JAR List选项 xff0c 点击clear把所有的jar包删掉再重新把jar包导入
  • Flask网页出现UnicodeDecodeError

    具体错误 xff1a UnicodeDecodeError 39 utf8 39 codec can 39 t decode byte 0xd6 in position 46 invalid continuation byte 如图 这是怎
  • 实用函数之计算某天是星期几

    功能 xff1a 给你一个日期 xff0c 计算出这一天是星期几 适用范围 xff1a 只对1600年以后的日期有效 实现语言 xff1a C C 43 43 acm相关题目 xff1a An problem about date 相关资料
  • 差分标记讲解

    引论 维护区间信息的数据结构有很多 xff0c 像线段树 树状数组等 xff1b 然而线段树之类的数据结构往往要写上一段板子 xff08 尽管不是太长 xff09 xff0c 但在算法竞赛中却很有可能导致我们与别人慢上那么几分钟 xff0c