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