筱玛爱线段树——差分
题意:
初始数组每个数都是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; }