cf295A. Greg and Array

来源:互联网 发布:ubuntu jdk 1.7 编辑:程序博客网 时间:2024/04/28 21:08
//代码含全角空格
#include <iostream>#include <cstdio>using namespace std;const int N=100010;long long a[N],b[N],query[N],sumq[N];int n,m,k,x,y;struct state{    int l,r,d;}op[N];int main(){        cin>>n>>m>>k;    for(int i=1;i<=n;i++) {        scanf("%I64d",&a[i]);        b[i]=a[i]-a[i-1];//差分    }    for(int i=1;i<=m;i++){        scanf("%d%d%d",&op[i].l,&op[i].r,&op[i].d);    }    while(k--){        scanf("%d%d",&x,&y);        query[x]++;query[++y]--;//++y    }    for(int i=1;i<=m;i++){        sumq[i]=query[i]+sumq[i-1];//差分        b[op[i].l]+=sumq[i]*op[i].d;        b[op[i].r+1]-=sumq[i]*op[i].d;//op[i].r+1    }    for(int i=1;i<=n;i++){        a[i]=a[i-1]+b[i];        printf("%I64d ",a[i]);    }    cout<<endl;    return 0;}/*思路:用两次差分数列, 先处理出对于每个op调用了几次, 再对数列执行操作.*/

0 0
原创粉丝点击