因为题目说了 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;
} 
京公网安备 11010502036488号