筱玛爱线段树
思路
比较容易想到离线后从后向前处理,所以我们只要维护两个差分数组即可了,
一个是答案数组,从前向后的,
一个是当编号被操作了几次的数组,从后向前的,
然后只需要按照要求模拟即可。
代码
/*
Author : lifehappy
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10, mod = 1e9 + 7;
ll op[N], l[N], r[N], ans[N], res[N], n, m;
int main() {
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; i++) {
scanf("%d %d %d", &op[i], &l[i], &r[i]);
}
for(int i = m; i >= 1; i--) {
res[i] = (res[i] + res[i + 1]) % mod;
if(op[i] == 1) {
ans[l[i]] = (ans[l[i]] + res[i] + 1) % mod;
ans[r[i] + 1] = (ans[r[i] + 1] - res[i] - 1 + mod) % mod;
}
else {
res[l[i] - 1] = (res[l[i] - 1] - res[i] - 1 + mod) % mod;
res[r[i]] = (res[r[i]] + res[i] + 1) % mod;
}
}
int key = 0;
for(int i = 1; i <= n; i++) {
key = (key + ans[i] + mod) % mod;
printf("%d%c", key, i == n ? '\n' : ' ');
}
return 0;
} 
京公网安备 11010502036488号