A. Greg and Array

http://codeforces.com/contest/295/problem/A

对于一个数组 如果是对某一连续的区间进行加上某个数 或者以等差数列的形式进行加数

都可以对此区间进行一定的标记 最后遍历一边就可以出结果

代码:

#include<iostream>

#include<cstdio>

#include<cstring>

#include<string>

#include<set>

#include<map>

#include<vector>

#include<queue>

#include<stack>



#define LL long long



using namespace std;

const int N=110000;

const LL MOD = 1000000007;

LL a[N],b[N];

int l[N],r[N];

LL value[N],num[N];



int main()

{

    //freopen("data.in","r",stdin);

    int n,m,k;

    while(cin>>n>>m>>k)

    {

        for(int i=1;i<=n;++i)

        cin>>a[i];

        for(int i=1;i<=m;++i)

        cin>>l[i]>>r[i]>>value[i];

        memset(num,0,sizeof(num));

        while(k--)

        {

            int L,R;

            cin>>L>>R;

            ++num[L];

            --num[R+1];

        }

        memset(b,0,sizeof(b));

        for(int i=1;i<=m;++i)

        {

            num[i]+=num[i-1];

            b[l[i]]+=(value[i]*num[i]);

            b[r[i]+1]-=(value[i]*num[i]);

        }

        //for(int i=1;i<=m;++i)

        //cout<<b[i]<<" ";cout<<endl;

        for(int i=1;i<=n;++i)

        {

            b[i]+=b[i-1];

            cout<<(a[i]+b[i])<<" ";

        }

        cout<<endl;



    }

    return 0;

}

 

你可能感兴趣的:(array)