记录编号 |
601689 |
评测结果 |
WWWWWWWWWW |
题目名称 |
795.[HAOI 2012]高速公路 |
最终得分 |
0 |
用户昵称 |
LikableP |
是否通过 |
未通过 |
代码语言 |
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...);
}