分析
观察题目可以发现题目要求维护两种数组的区间加
- 当
Opt==2时,将操作区间加一
- 当
Opt==1时,将数组范围内的数加一
我们还发现,第一种区间加,会影响第二种区间加
所以我们在维护第一种区间加的基础上再维护第二种区间加
并且我们发现第一种区间加会影响它之前的询问
所以我们需要倒叙维护每个操作的次数
由于是区间加,并且需要遍历数组,所以我们直接考虑差分即可
最后再来从头到尾扫一次数的差分数组
即可得到答案
温馨提示:到处都要记得取模,否则/xyx
代码
//Nowcoder 25737
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#define LL long long
#define Cl(X,Y) memset((X),(Y),sizeof(X))
#define FOR(i,A,B) for(LL i=A;i<=B;i++)
#define BOR(i,A,B) for(LL i=A;i>=B;i--)
#define Lowbit(X) (X & (-X))
#define Skip cout<<endl;
#define INF 0x3f3f3f3f
#define Mod 1000000007
#define Rson (X<<1|1)
#define Lson (X<<1)
using namespace std;
const LL MaxN=1e5+10;
LL Total,Test;
LL Cnt_one[MaxN],Cnt_two[MaxN];
struct Node {
LL L,R,Opt;
}Sig[MaxN];
inline void File() {
freopen(".in","r",stdin);
freopen(".out","w",stdout);
}
signed main() {
// File();
ios::sync_with_stdio(false);
cin>>Total>>Test;
FOR(i,1,Test) cin>>Sig[i].Opt>>Sig[i].L>>Sig[i].R;
LL New=0;
BOR(i,Test,1) {
(New+=Cnt_one[i])%=Mod;
if(Sig[i].Opt==1) { (Cnt_two[Sig[i].L]+=New+1)%=Mod; (Cnt_two[Sig[i].R+1]-=New+1)%=Mod; }
else { (Cnt_one[Sig[i].R]+=New+1)%=Mod; (Cnt_one[Sig[i].L-1]-=New+1)%=Mod; }
}
// FOR(i,1,Test) { cout<<"i: "<<i<<" Cnt_one[]: "<<Cnt_one[i]<<endl; }
New=0;
FOR(i,1,Total) {
(New+=Cnt_two[i])%=Mod;
cout<<(New%Mod+Mod)%Mod<<" ";
}
cout<<endl;
// fclose(stdin);
// fclose(stdout);
system("pause");
return 0;
} 
京公网安备 11010502036488号