题意
给你一个初始值为的序列。你现在有两种操作,一是给的区间加;二是再执行一遍第次到第次的操作。
思路
两次差分。第一次为处理第二种操作,我们定义为第次操作要执行的次数,用差分实现。第二次是处理区间加,也可以用差分。
所以,差分就对啦!
代码
#include<bits/stdc++.h> #define ll long long const int N=1e5+5,INF=0x3f3f3f3f,mod=1e9+7; using namespace std; int n,m; int opt[N],l[N],r[N],ans[N],sum[N]; inline int read() { register int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar(); return x*f; } int main() { n=read();m=read(); for(int i=1;i<=m;i++) opt[i]=read(),l[i]=read(),r[i]=read(); for(int i=m;i>=1;i--) { sum[i]+=sum[i+1]; sum[i]%=mod; if(opt[i]==1) ans[r[i]+1]=(ans[r[i]+1]-sum[i]-1+mod)%mod, ans[l[i]]=(ans[l[i]]+sum[i]+1)%mod; else sum[l[i]-1]=(sum[l[i]-1]-sum[i]-1+mod)%mod, sum[r[i]]=(sum[r[i]]+sum[i]+1)%mod; } int now=0; for(int i=1;i<=n;i++) { now+=ans[i]; now%=mod; printf("%d ",now); } return 0; }