筱玛爱线段树

链接:https://ac.nowcoder.com/acm/problem/25737
来源:牛客网

题目描述
筱玛是一个热爱线段树的好筱玛。
筱玛的爷爷马爷在游戏中被筱玛吊打了,于是他恼羞成怒,决定给筱玛出这样一道数据结构题:
给定一个长度为nn的数组AA,刚开始每一项的值均为00。
支持以下两种操作,操作共mm次:
\texttt{1 l r}1 l r:将A_l\sim A_rAl∼A r的每一项的值加上11。
\texttt{2 l r}2 l r:执行操作编号在[l,r][l,r]内的所有操作各一次,保证rr小于当前操作的编号。
mm次操作结束后,你要告诉马爷AA数组变成什么样子了。
由于答案可能会很大,你只需要输出数组AA中的每个数在模10^9+710
9
+7意义下的值。
输入描述:
第一行两个数n,mn,m,分别表示数组长度及操作次数。
接下来mm行,每行三个数opt,l,ropt,l,r,表示一次操作。
输出描述:
输出一行共nn个数,表示mm次操作结束后, 的值。

示例1
输入

4 3
1 1 3
2 1 1
1 1 3

输出

3 3 3 0
#include <iostream>
#include <bits/stdc++.h>
#include<algorithm>
#include<queue>
#include<cstring>
#include<stack>
#define ll long long
using namespace std;

const int N=1e5+100;
const ll mod=1e9 + 7;
ll b[N],a[N];
int op[N],l[N],r[N];
void add(int x,ll w)
{

    while(x<N) (b[x]+=w)%=mod,x+=x&-x;
}
ll query(int x)
{

    ll res=0;
    while(x)(res+=b[x])%=mod,x-=x&-x;return res;
}
int main()
{

    int n,m;
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {

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

    }
    for(int i=m;i>=1;i--)

    {
        int f=(query(i)+1)%mod;
        if(op[i]==1)
        {

            (a[l[i]]+=f)%=mod;
            (a[r[i]+1]+=mod-f)%=mod;
        }
        else
        {

            add(l[i],f);
            add(r[i]+1,mod-f);
        }
    }
    for(int i=1;i<=n;i++)
    {

        (a[i]+=a[i-1])%=mod;
        cout<<a[i];
        i==n?cout<<endl:cout<<" ";
    }
    return 0;
}

x&-x 含义可见以下链接

https://blog.csdn.net/oyoung_2012/article/details/79932394

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值