1 条题解
-
1
#include <algorithm> #include <cctype> #include <cstdio> #include <cstring> const int L = 2050; const int N = 200050; const int C = 1000050; int m, len, cl[C], cr[C], cd[C], ans[N], k; int P[L * 2]; int readInt() { int ans = 0, c, f = 1; while (!isdigit(c = getchar())) if (c == '-') f = -1; do ans = ans * 10 + c - '0'; while (isdigit(c = getchar())); return ans * f; } struct Event { int tp, x, y, id; Event() {} Event(int t, int X, int T, int id = 0) : tp(t), x(X - T + 2 * len), y(X + T), id(id) { } friend bool operator<(const Event &a, const Event &b) { if (a.x != b.x) return a.x < b.x; return a.y < b.y; } } e1[N * 2], e2[N * 2]; int S[L * 3], ll; void add(int x, int y) { for (++x; x <= ll; x += x & -x) S[x] += y; } int get(int x) { int y = 0; for (++x; x; x &= x - 1) y += S[x]; return y; } void Solve(Event *e, int l, int r) { if (l == r - 1) return; int mid = (l + r) / 2; Solve(e, l, mid); Solve(e, mid, r); for (int i = l, j = mid; i < mid || j < r; ) { if (i < mid && (j == r || e[i].x <= e[j].x)) { if (e[i].tp) add(e[i].y, e[i].tp); ++i; } else { if (!e[j].tp) ans[e[j].id] += get(e[j].y); ++j; } } for (int i = l; i < mid; ++i) if (e[i].tp) add(e[i].y, -e[i].tp); std::inplace_merge(e + l, e + mid, e + r); } inline void eventAdd(int L, int R, int D, int tp) { if (D == 1) { e1[m] = Event(tp, L, 0); e1[m + 1] = Event(tp, 0, 2 * len - L); P[len - L] -= tp; e2[m] = Event(-tp, R, 0); e2[m + 1] = Event(-tp, R - L, 2 * len - L); } else { e1[m] = Event(tp, 0, L); e1[m + 1] = Event(tp, L, 2 * len); P[len + L] -= tp; e2[m] = Event(-tp, R - L, L); e2[m + 1] = Event(-tp, R, 2 * len); } m += 2; } inline void eventQuery(int L, int R, int T, int i) { e1[m] = Event(0, R, T, i); e2[m++] = Event(0, L - 1, T, i); if (R == len) ans[i] += P[T]; } int main() { int n = readInt(); len = readInt(); while (n--) { int op = readInt(), T = readInt() % (2 * len); if (op == 1) { int C = readInt(), L = readInt(), R = readInt() - L, D = readInt(); for (L -= T * D; L < 0 || L > len; D = -D) L = L < 0 ? -L : 2 * len - L; eventAdd(L, R += L, D, 1); cl[C] = L; cr[C] = R; cd[C] = D; } else if (op == 2) { int L = readInt(), R = readInt(); eventQuery(L, R, T, k++); } else { int C = readInt(); eventAdd(cl[C], cr[C], cd[C], -1); } } ll = len * 3; Solve(e1, 0, m); Solve(e2, 0, m); for (int i = 0; i < k; ++i) printf("%d\n", ans[i]); return 0; }
- 1
信息
- ID
- 1062
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 10
- 已通过
- 4
- 上传者