因为题目说了 2 l r
操作保证 r 小于当前操作编号, 于是我们可以先把所有操作存起来再倒着做.
sum[n] 用来存储第 i 次操作执行了几次, 用差分实现.
ans[n] 用来存储数组的值, 用差分来更新.
#include <bits/stdc++.h> using namespace std; #define mem(a, b) memset(a, b, sizeof(a)) #define PI acos(-1) #define debug(a) cout << (a) << endl typedef long long ll; int dir8[8][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 1 }, { 1, -1 }, { -1, 1 }, { -1, -1 } }; int dir4[4][2] = { 1, 0, 0, 1, -1, 0, 0, -1 }; const int INF = 0x3f3f3f3fLL; const long long LLF = 0x3f3f3f3f3f3f3f3fLL; const int maxn = 1e5 + 15; const int mod = 1e9 + 7; ll ans[maxn], sum[maxn]; int opt[maxn], l[maxn], r[maxn]; int main() { int n, m; cin >> n >> m; for (int i = 1; i <= m; i++) cin >> opt[i] >> l[i] >> r[i]; for (int i = m; i; i--) { sum[i] = (sum[i] + sum[i + 1]) % mod; if (opt[i] == 1) { ans[l[i]] = (ans[l[i]] + sum[i] + 1) % mod; ans[r[i] + 1] = (ans[r[i] + 1] - sum[i] - 1 + mod) % 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; } } for (int i = 1; i <= n; i++) { ans[i] = (ans[i] + ans[i - 1]) % mod; cout << ans[i] << " "; } return 0; }