数组上的范围更新

时间:2017-09-02 06:19:22

标签: arrays segment-tree fenwick-tree

你有n个长度数组,最初所有元素都是0。你必须执行2种类型的m命令。

  

类型1: l r(l≤l≤r≤n) - 将数组的所有元素增加1,           其指数属于范围[l,r]。

     

类型2: l r(1≤l≤r≤m) - 执行索引所在的所有命令           范围[l,r]。保证r严格小于
          枚举/当前命令的编号。

输入:

第一行包含整数n和m。接下来的m行包含格式的命令,在语句中描述:t,l,r,其中t - 类型的数量(1或2)。

输出:

执行每个命令后打印一个数组a。数字必须用空格分隔。因为数字可能非常大,所以以模数109 + 7打印它们。

约束:

1 ≤ n, m ≤ 105

1 个答案:

答案 0 :(得分:0)

这是codechef问题,您可以看到编辑here 这是我的源代码

#include<bits/stdc++.h>
#define mp(x,y) make_pair((x),(y))
#define ll long long int
#define mem(x,y) memset(x,y,sizeof(x))
#define pb push_back
#define MOD (ll)(1e9+7)
#define X first
#define all(a) a.begin(),a.end()
#define Y second
#define f(i,a,b) for(int i=a;i<b;i++)
using namespace std;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;

struct query{
    int type,l,r;
};
query q[100005];
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int t;
    cin>>t;
    while(t--){
        int n,m;
        cin>>n>>m;
        vll a(n+1,0),c(m+1,0);
        ll sum=0;
        for(int i=1;i<=m;i++){
            cin>>q[i].type>>q[i].l>>q[i].r;
        }
        for(int i=m;i>=1;i--){
          //  f(i,1,m+1)cout<<c[i]<<" ";cout<<"\n";
            c[i-1]+=c[i];
            c[i-1] = (c[i-1]+MOD)%MOD;
            if(q[i].type==2){
                c[q[i].r]+=c[i]+1;
                c[q[i].r] = (c[q[i].r]+MOD)%MOD;
                c[q[i].l-1]-=c[i]+1;
                c[q[i].l-1] = (c[q[i].l-1]+MOD)%MOD;
            }
        }
        for(int i=1;i<=m;i++){
            if(q[i].type==1){
                a[q[i].r]+=c[i]+1;
                a[q[i].r] = (a[q[i].r]+MOD)%MOD;
                a[q[i].l-1]-=(c[i]+1);
                a[q[i].l-1] = (a[q[i].l-1]+MOD)%MOD;
            }
        }
        for(int i=n-1;i>=1;i--){
            a[i] = a[i+1]+a[i];
            a[i] = (a[i]+MOD)%MOD;
        }
        f(i,1,n+1)cout<<a[i]<<" ";
        cout<<"\n";
    }
    return 0;
}