zoukankan      html  css  js  c++  java
  • 数据结构:差分数组

    差分数组不仅仅是一个优秀的数据结构,还是一种很好的思想

    差分数组的功能是修改区间,查询点

    修改区间的时间复杂度是O(1),查询点的时间复杂度为O(n)

    我们这里要根据数据范围灵活选取方法,不要拘泥于差分数组

    void update(int x,int y,int z)
    {
        b[x]+=z;
        b[y+1]-=z;
    }

    以上是修改区间操作,x位置加上修改量,y+1位置减去修改量,这样整个区间的元素就相当于修改了

    int sum(int x)
    {
        int ans=0;
        for(int i=1;i<=x;i++)
            ans+=b[i];
        return ans;
    }

    刚才方便了,但是查询的时候就需要全部都加一遍了

    还有就是预处理的时候

        b[1]=a[1];
        for(int i=2;i<=n;i++)
            b[i]=a[i]-a[i-1];

    下面给出有一个完整的实现代码:

     1 //aininot260
     2 //修改区间,查询点
     3 #include<iostream>
     4 #include<cstring>
     5 using namespace std;
     6 const int maxn=100005;
     7 const int maxq=100005;
     8 int a[maxn];
     9 int b[maxn];
    10 int n,q;
    11 void update(int x,int y,int z)
    12 {
    13     b[x]+=z;
    14     b[y+1]-=z;
    15 }
    16 int sum(int x)
    17 {
    18     int ans=0;
    19     for(int i=1;i<=x;i++)
    20         ans+=b[i];
    21     return ans;
    22 }
    23 int main()
    24 {
    25     cin>>n;
    26     for(int i=1;i<=n;i++)
    27         cin>>a[i];
    28     b[1]=a[1];
    29     for(int i=2;i<=n;i++)
    30         b[i]=a[i]-a[i-1];
    31     cin>>q;
    32     while(q--)
    33     {
    34         int x;
    35         cin>>x;
    36         if(x==1)
    37         {
    38             int y,z,w;
    39             cin>>y>>z>>w;
    40             update(y,z,w);
    41         }
    42         if(x==2)
    43         {
    44             int y;
    45             cin>>y;
    46             cout<<sum(y)<<endl;
    47         }
    48     }
    49     return 0;
    50 }
  • 相关阅读:
    HDU 2066 一个人的旅行 最短路问题
    HDU 2112 HDU Today 最短路
    HDU 2521 反素数 模拟题
    mac 安装 office
    selenium用法 (python)
    selenium遇到不可编辑input和隐藏input如何赋值
    mac 下bash命令
    ssh 自动登录
    linux常用命令
    json字符串调整
  • 原文地址:https://www.cnblogs.com/aininot260/p/9304521.html
Copyright © 2011-2022 走看看