1 条题解

  • 1
    @ 2022-8-29 9:15:52
    #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
    上传者