区间 (interval)

题目链接:https://ac.nowcoder.com/acm/problem/16722

  • 差分模版
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll sum[1000005];
ll a[1000005];
ll d[1000005];
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        int p,l,r;
        ll q;
        memset(d,0,sizeof(d));
        memset(sum,0,sizeof(sum));
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
        }
        while(m--)
        {
            scanf("%d%d%d%lld",&p,&l,&r,&q);
            if(p==1)
            {
                d[l]+=-q;
                d[r+1]-=-q;
            }
            else 
            {
                d[l]+=q;
                d[r+1]-=q;
            }
        }
        scanf("%d%d",&l,&r);
        for(int i=2;i<=n;i++)
        {
            d[i]+=d[i-1];
        }
        for(int i=1;i<=n;i++)
        {
            sum[i]=sum[i-1]+d[i]+a[i];
        }
        printf("%lld\n",sum[r]-sum[l-1]);
    }
}
posted @ 2023-02-26 10:04  TFLSNOI  阅读(187)  评论(0编辑  收藏  举报