牛客练习赛49_D_筱玛爱线段树

26 篇文章 0 订阅
20 篇文章 0 订阅

今天,厚颜无耻的说勉强是自己一个人写出的题吧,其实要是没有左学长的提醒,我估计会在线段树上转一上午。

先上题面:https://ac.nowcoder.com/acm/contest/946/D

大意:给你n个数的数组和m个操作,数组的初始值全部为0,操作的种类只有2种,一种是将数组[l,r]中的数全部加上1,另一种是将操作编号为[l,r]的操作再全部进行一遍。求m次操作后的数组的模样。

首先,看到区间修改,立马联想到线段树,然后又看到对操作进行区间修改,顺着思路就想:线段树套线段树????尼玛,这怕不是要搞死我,我立马和左学长讨论了一下,左学长淡然的说:用差分数组,我愣了下神——卧槽,差分数组,我咋就没想到哩!

然后我就用两个差分数组,一个记录每一个编号的操作次数的差分数组,另一个记录要求数组的值
写完blog才发现,是被标题误导了。。。。。

结果做到最后一步,发现自己没有取模,想了半天才发现的,死菜鸡一枚,确定了

上代码:

#include <bits/stdc++.h>
const int mod=1e9+7;
const int maxn=1e5+7;
using namespace std;
typedef long long ll;
struct opera{
    int cnt,l,r;
}opt[maxn];
int n,m;
int tpach[maxn],apach[maxn];
int main()
{
    memset(tpach,0,sizeof(tpach));
    memset(apach,0,sizeof(apach));
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d %d %d",&opt[i].cnt,&opt[i].l,&opt[i].r);
    }
    int t=0;
    tpach[m+1]=1,tpach[1]=-1;
    for(int i=m;i>=1;i--){
        t=(t+tpach[i+1])%mod;//t就是每一次操作进行的次数
        if(opt[i].cnt==2){
                tpach[opt[i].l]=(tpach[opt[i].l]-t+mod)%mod;
                tpach[opt[i].r+1]=(tpach[opt[i].r+1]+t)%mod;
                //tpach是记录操作次数的差分数组
        }
        else{
                apach[opt[i].l-1]=(apach[opt[i].l-1]+t)%mod;
                apach[opt[i].r]=(apach[opt[i].r]-t+mod)%mod;
                //apach是记录数组的差分数组
        }
    }
    int s=0;
    for(int i=1;i<=n;i++){
            s=(s+apach[i-1])%mod;
        printf("%d%c",s,i==n?'\n':' ');
    }
    return 0;
}
//千万不要忘记取模呀!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值