筱玛爱线段树——差分

图片说明

题意:

初始数组每个数都是0.
存在俩个操作
1 l r 将l到r的每一个数都加1
2 l r 将l到r的每个操作再执行一次
让你输出最后数组的结果,由于答案可能很大,取模1e9+7

题解:

刚学的差分数组
flag[]倒序维护操作差分数组,求后缀和,求出这个点实际的操作次数之后,再对前面的操作差分修改
f[]正序维护值的差分数组,已知flag[]中1的操作的实际操作次数之后,对f[]数组差分修改,最后求前缀和

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int mod = 1e9+7;
const int maxx = 100010;
int flag[maxx],f[maxx];
int op[maxx],l[maxx],r[maxx];
int n,m;
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
        scanf("%d%d%d",&op[i],&l[i],&r[i]);
    flag[m] = 1;
    for(int i=m;i>=1;i--){
        flag[i] = (flag[i] + flag[i+1])%mod;
        if(op[i] == 1){
            f[l[i]] = (f[l[i]] + flag[i])%mod;
            f[r[i]+1] = (f[r[i]+1] - flag[i]+mod)%mod;
        }
        else{
            flag[r[i]] = (flag[r[i]] + flag[i])%mod;
            flag[l[i]-1] = (flag[l[i]-1] - flag[i]+mod)%mod;
        }
    }
    for(int i=1;i<=n;i++){
        f[i] = (f[i] + f[i-1])%mod;
        cout<<f[i]<<" ";
    }
    return 0;
}
全部评论

相关推荐

吐泡泡的咸鱼:我也工作了几年了,也陆陆续续面试过不少人,就简历来说,第一眼学历不太够,你只能靠你的实习或者论文或者项目经历,然后你没有论文,没有含金量高的比赛和奖项,只能看实习和项目,实习来说,你写的实习经历完全不清楚你想找什么工作?行研?数据分析?且写的太少了,再看项目,这些项目先不说上过大学读过研究生的都知道很水,然后对你想找的岗位有什么帮助呢?项目和实习也完全不匹配啊,你好像在努力将你所有的经历都放在简历里想表现你的优秀,但是对于你想找的岗位来说,有什么用呢?最后只能获得岗位不匹配的评价。所以你需要明白你想要找的岗位要求是什么,是做什么的,比如产品经理,然后再看你的经历里有什么匹配的上这个岗位,或者对这个岗位以及这个岗位所在的公司有价值,再写到你的简历上
点赞 评论 收藏
分享
缒梦&独舞:这家公司是这样的,去年给我实习offer了,不过也是面着玩儿的,他周六还要去做公益志愿活动
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务