开了 30 个线段树,MLE了。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, t, o;
struct SEGMENTTREE {
struct SegmentTree {
int l, r;
int add;
int lazy_add = -1;
} tr[N << 2];
void up(int k) {
tr[k].add = tr[k << 1].add + tr[k << 1 | 1].add;
}
void down(int k) {
if (tr[k].lazy_add == -1) return ;
int ls = k << 1, rs = k << 1 | 1;
tr[ls].lazy_add = tr[k].lazy_add;
tr[rs].lazy_add = tr[k].lazy_add;
tr[ls].add = tr[k].lazy_add;
tr[rs].add = tr[k].lazy_add;
tr[k].lazy_add = -1;
}
void Build(int k, int l, int r) {
tr[k].l = l, tr[k].r = r;
if (l == r) {
tr[k].add = 0;
return ;
}
int mid = l + r >> 1;
Build(k << 1, l, mid);
Build(k << 1 | 1, mid + 1, r);
up(k);
}
void Updata(int k, int l, int r, int val) {
if (tr[k].l > r || tr[k].r < l) return ;
if (l <= tr[k].l && tr[k].r <= r) {
tr[k].add = val;
tr[k].lazy_add = val;
return ;
}
down(k);
Updata(k << 1, l, r, val);
Updata(k << 1 | 1, l, r, val);
up(k);
}
int Query(int k, int l, int r) {
if (tr[k].l > r || tr[k].r < l) return 0;
if (l <= tr[k].l && tr[k].r <= r) return tr[k].add;
down(k);
return Query(k << 1, l, r) + Query(k << 1 | 1, l, r);
}
} tree[31];
signed main() {
cin >> n >> t >> o;
for (int i = 1; i <= t; i ++ ) tree[i].Build(1, 1, n);
tree[1].Updata(1, 1, n, 1);
while (o -- ) {
char ch;
int l, r, k;
cin >> ch >> l >> r;
if (l > r) swap(l, r);
if (ch == 'C') {
cin >> k;
for (int i = 1; i <= t; i ++ ) {
if (i == k) tree[i].Updata(1, l, r, 1);
else tree[i].Updata(1, l, r, 0);
}
} else {
int res = 0;
for (int i = 1; i <= t; i ++ ) {
int t = tree[i].Query(1, l, r);
if (t) res ++ ;
}
cout << res << endl;
}
// for (int i = 1; i <= t; i ++ ) {
// for (int j = 1; j <= n; j ++ )
// cout << tree[i].Query(1, j, j) << " ";
// cout << endl;
// }
// cout << endl;
}
return 0;
}