• 牛客小白月赛5 区间 (interval)


     传送门

     题目大意就是给你长度为n的区间,然后有m次操作,操作完了再查询区间和。

      做法就是用前缀和和差分,这是我第一次用差分,首先设一个change数组用来存每个位置的变化值,先清0,假如是修改[l,r]区间,该区间每个数加p的话,c[l]+=p,c[r+1]-=p,之所以不是直接c[l]=p,c[r+1]=-p,是因为可能修改不止是一次,当然m次操作完了之后,此时c[i]还不是a[i]的变化值,要求啊a[i]的变化值,需要求c数组的前缀和,求完之后c[i]即是代表了a[i]的变化值了,对c数组和a数组同时求前缀和,然后m次操作后区间和就是a[r]-a[l-1]

    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 1000005
    #define ll long long
    ll a[maxn],c[maxn];
    int main()
    {
        memset(a,0,sizeof(a));
        memset(c,0,sizeof(c));
        int n,m,q,l,r,p;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        for(int i=1;i<=m;i++)
        {
            cin>>q>>l>>r>>p;
            if(q==1)
                p=-p;
            c[l]+=p;
            c[r+1]-=p;
        }
        for(int i=1;i<=n;i++)
        {
            c[i]=c[i-1]+c[i];
            a[i]=a[i-1]+a[i]+c[i];
        }
        cin>>l>>r;
        cout<<a[r]-a[l-1]<<endl;
        return 0;
    }
    
  • 相关阅读:
    java基础--日期--练习集锦
    java基础-数字与字符串-练习集锦
    java-多态-之疑惑
    java-接口与多态-
    java基础 -继承-练习集锦
    java基础-对象-练习集锦
    java基础--数组--练习集锦
    hibernate第二天
    jquery的一些笔记
    struts入门2
  • 原文地址:https://www.cnblogs.com/eason9906/p/11755082.html
Copyright © 2020-2023  润新知