程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [CF 295A]Grag and Array[差分數列]

[CF 295A]Grag and Array[差分數列]

編輯:C++入門知識

題意:

有數列a[ ]; 操作op[ ] = { l, r, d }; 詢問q[ ] = { x, y };

操作表示對a的[ l, r ] 區間上每個數增加d; 詢問表示執行[ x, y ]之間的op.

打印最終數列.

思路:

用兩次差分數列, 先處理出對於每個op調用了幾次, 再對數列執行操作.

 

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1e5+5;
typedef long long ll;
ll a[MAXN],sum[MAXN];
ll d[MAXN],delta[MAXN];
int l[MAXN],r[MAXN];

int main()
{
    int n,m,k;
    scanf("%d %d %d",&n,&m,&k);
    for(int i=1;i<=n;i++)
        scanf("%I64d",a+i);
    for(int i=1;i<=m;i++)
        scanf("%d %d %I64d",l+i,r+i,delta+i);
    int x,y;
    while(k--)
    {
        scanf("%d %d",&x,&y);
        d[x]++;d[y+1]--;
    }
    for(int i=1;i<=m;i++)
    {
        sum[i] = sum[i-1] + d[i];
        delta[i] *= sum[i];
    }
    memset(d,0,sizeof(d));
    memset(sum,0,sizeof(sum));
    for(int i=1;i<=m;i++)
    {
        if(!delta[i])    continue;
        d[l[i]] += delta[i];
        d[r[i]+1] -= delta[i];
    }
    for(int i=1;i<=n;i++)
    {
        sum[i] = sum[i-1] + d[i];
        a[i] += sum[i];
        printf("%I64d%c",a[i],i==n?'\n':' ');
    }
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved