zoukankan      html  css  js  c++  java
  • 差分序列

    前言

    差分序列常用于维护需要进行区间加操作的序列,但是无法做到区间查询。

    原理

    已知一组序列,用数组 a 保存。ai表示第序列第 i 个元素。建立一个数组b,其中:

                                                         bi = ai - ai-1

    因此 a1 = b1 ,ai = bi + ai-1

    由于差分序列的性质,当我们对[l ,  r]这个区间统一进行加d操作时,只需要对

                                                    bl += d      br+1 –= d

    代码

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #define maxn 100000
    using namespace std;
    int d[maxn + 5];
    void add(int a, int b){
    	d[a] += 1;
    	d[b + 1] -= 1;
    }
    int main(){
    	int n;
    	scanf("%d", &n);
    	for(int i = 1; i <= n; i++){
    		int a, b;
    		scanf("%d %d", &a, &b);
    		add(a, b);
    	}
    	//依次输出元素 
    	int t = d[1];
    	printf("%d ", d[1]);
    	for(int i = 2; i <= n; i++){
    		printf("%d ", d[i] + t);
    		t += d[i];
    	}
    	return 0;
    }
    
    

    与树状数组对比

     

    差分序列

    树状数组

    适合做

    区间加

    单点查询

    单点加

    区间查询

    不适合做

    区间查询

    区间加

  • 相关阅读:
    dmesg
    [转]df命令
    [转]linux /proc/cpuinfo 文件分析
    awk
    sed
    [转]进程间通信
    Bootstrap 树形列表与右键菜单
    Maven国内仓库
    《深入剖析Tomcat》源码
    Spring in Action学习笔记(2)
  • 原文地址:https://www.cnblogs.com/woxiaosade/p/10887473.html
Copyright © 2011-2022 走看看