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;
}

 

posted on 2013-04-17 18:48  夜->  阅读(122)  评论(0编辑  收藏  举报