分析
观察题目可以发现题目要求维护两种数组的区间加
- 当
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; }