记录编号 601689 评测结果 WWWWWWWWWW
题目名称 795.[HAOI 2012]高速公路 最终得分 0
用户昵称 GravatarLikableP 是否通过 未通过
代码语言 C++ 运行时间 0.817 s
提交时间 2025-06-27 14:26:24 内存使用 6.21 MiB
显示代码纯文本
#include <cstdio>
typedef long long ll;

template <typename T> T read();
template <typename T> void write(T);
template <typename T, typename... Others> void write(T, Others...);
char read();
void write(char);
ll GCD(ll, ll);

const int MAXN = 1e5 + 10;
ll prei[MAXN], preii[MAXN];

struct SegmentTree {
  struct NODE {
    ll sum;
    ll isum;
    ll iisum;
    ll lazy;
  } node[MAXN << 2];

#define ls(root) root << 1
#define rs(root) root << 1 | 1
  void PushUp(int root) {
    node[root].sum = node[ls(root)].sum + node[rs(root)].sum;
    node[root].isum = node[ls(root)].isum + node[rs(root)].isum;
    node[root].iisum = node[ls(root)].iisum + node[rs(root)].iisum;
  }

  void PushDown(int root, int lt, int rt) {
    if (node[root].lazy) {
      ll &lazy = node[root].lazy;
      NODE &ls = node[ls(root)], &rs = node[rs(root)];
      int mid = lt + ((rt - lt) >> 1);
      ls.sum += (mid - lt + 1) * lazy;
      ls.isum += (prei[mid] - prei[lt - 1]) * lazy;
      ls.iisum += (preii[mid] - preii[lt - 1]) * lazy;
      ls.lazy += lazy;
      rs.sum += (rt - mid) * lazy;
      rs.isum += (prei[rt] - prei[mid]) * lazy;
      rs.iisum += (preii[rt] - preii[mid]) * lazy;
      rs.lazy += lazy;
      lazy = 0;
    }
  }

  void AddSeq(int root, int lt, int rt, int lq, int rq, ll val) {
    if (lt == lq && rt == rq) {
      node[root].sum += (rt - lt + 1) * val;
      node[root].isum += (prei[rt] - prei[lt - 1]) * val;
      node[root].iisum += (preii[rt] - preii[lt - 1]) * val;
      node[root].lazy += val;
      return;
    }
    PushDown(root, lt, rt);
    int mid = lt + ((rt - lt) >> 1);
    if (rq <= mid) {
      AddSeq(ls(root), lt, mid, lq, rq, val);
    } else if (lq > mid) {
      AddSeq(rs(root), mid + 1, rt, lq, rq, val);
    } else {
      AddSeq(ls(root), lt, mid, lq, mid, val);
      AddSeq(rs(root), mid + 1, rt, mid + 1, rq, val);
    }
    PushUp(root);
  }

  ll GetiiSum(int root, int lt, int rt, int lq, int rq) {
    if (lt == lq && rt == rq) {
      return node[root].iisum;
    }
    PushDown(root, lt, rt);
    int mid = lt + ((rt - lt) >> 1);
    if (rq <= mid) {
      return GetiiSum(ls(root), lt, mid, lq, rq);
    } else if (lq > mid) {
      return GetiiSum(rs(root), mid + 1, rt, lq, rq);
    } else {
      return GetiiSum(ls(root), lt, mid, lq, mid) + GetiiSum(rs(root), mid + 1, rt, mid + 1, rq);
    }
  }

  ll GetiSum(int root, int lt, int rt, int lq, int rq) {
    if (lt == lq && rt == rq) {
      return node[root].isum;
    }
    PushDown(root, lt, rt);
    int mid = lt + ((rt - lt) >> 1);
    if (rq <= mid) {
      return GetiSum(ls(root), lt, mid, lq, rq);
    } else if (lq > mid) {
      return GetiSum(rs(root), mid + 1, rt, lq, rq);
    } else {
      return GetiSum(ls(root), lt, mid, lq, mid) + GetiSum(rs(root), mid + 1, rt, mid + 1, rq);
    }
  }

  ll GetSum(int root, int lt, int rt, int lq, int rq) {
    if (lt == lq && rt == rq) {
      return node[root].sum;
    }
    PushDown(root, lt, rt);
    int mid = lt + ((rt - lt) >> 1);
    if (rq <= mid) {
      return GetSum(ls(root), lt, mid, lq, rq);
    } else if (lq > mid) {
      return GetSum(rs(root), mid + 1, rt, lq, rq);
    } else {
      return GetSum(ls(root), lt, mid, lq, mid) + GetSum(rs(root), mid + 1, rt, mid + 1, rq);
    }
  }

  ll Query(int root, int lt, int rt, int lq, int rq) {
    ll a = GetiiSum(root, lt, rt, lq, rq);
    ll b = GetiSum(root, lt, rt, lq, rq);
    ll c = GetSum(root, lt, rt, lq, rq);
    return -a + (lt + rt - 1) * b + (rt - lt * rt) * c;
  }
} T;

int n, m;

int main() {
  freopen("roadxw.in", "r", stdin);
  freopen("roadxw.out", "w", stdout);
  n = read<int>(), m = read<int>();
  for (int i = 1; i <= n; ++i) {
    prei[i] = i;
    prei[i] += prei[i - 1];
    preii[i] = i * i;
    preii[i] += preii[i - 1];
  }
  while (m--) {
    char op = read();
    if (op == 'C') {
      int l = read<int>(), r = read<int>();
      ll v = read<ll>();
      T.AddSeq(1, 1, n - 1, l, r - 1, v);
    } else {
      int l = read<int>(), r = read<int>();
      ll a = T.Query(1, 1, n - 1, l, r - 1) * 2;
      ll b = (r - l + 1) * (r - l);
      ll gcd = GCD(a, b);
      a /= gcd, b /= gcd;
      write(a, '/', b, '\n');
    }
  }
  return 0;
}

ll GCD(ll x, ll y) {
  return y == 0 ? x : GCD(y, x % y);
}

#define isdigit(ch) (ch >= '0' && ch <= '9')
template <typename T> T read() {
  T res = 0, f = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') f = -1;
  for (; isdigit(ch); ch = getchar()) res = (res << 3) + (res << 1) + (ch ^ 48);
  return res * f;
}

#define isspace(ch) (ch == ' ' || ch == '\n')
char read() {
  char ch = getchar();
  for (; isspace(ch); ch = getchar());
  return ch;
}

void write(char x) {
  putchar(x);
}

template <typename T> void write(T x) {
  if (x < 0) putchar('-'), x = -x;
  static int sta[sizeof(T) << 2], top = 0;
  do {
    sta[++top] = x % 10;
    x /= 10;
  } while (x);
  while (top) {
    putchar(sta[top--] ^ 48);
  }
}

template <typename T, typename... Others> void write(T x, Others... y) {
  write(x);
  write(y...);
}