题意
给你一个初始值为的序列
。你现在有两种操作,一是给
的区间加
;二是再执行一遍第
次到第
次的操作。
思路
两次差分。第一次为处理第二种操作,我们定义为第
次操作要执行的次数,用差分实现。第二次是处理区间加,也可以用差分。
所以,差分就对啦!
代码
#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;
}
京公网安备 11010502036488号