比赛 |
2025.5.4 |
评测结果 |
TTTTTTTTTT |
题目名称 |
数列操作η |
最终得分 |
0 |
用户昵称 |
LikableP |
运行时间 |
19.990 s |
代码语言 |
C++ |
内存使用 |
2.29 MiB |
提交时间 |
2025-05-04 11:10:58 |
显示代码纯文本
#include <cstdio>
#include <algorithm>
const int MAXN = 1e5 + 10;
int n, q;
int b[MAXN];
int a[MAXN];
struct SegmentTree {
#define ls(root) root << 1
#define rs(root) root << 1 | 1
struct NODE {
int minn, maxx;
int lazy;
} node[MAXN << 2];
void PushUp(int root, int lt, int rt) {
node[root].minn = ::std::min(node[ls(root)].minn, node[rs(root)].minn);
node[root].maxx = ::std::max(node[ls(root)].maxx, node[rs(root)].maxx);
}
void Build(int root, int lt, int rt) {
printf("%d %d\n", lt, rt);
if (lt == rt) {
node[root].minn = b[lt];
node[root].maxx = b[lt];
return ;
}
int mid = lt + ((rt - lt) >> 1);
Build(ls(root), lt, mid);
Build(rs(root), mid + 1, rt);
PushUp(root, lt, rt);
}
void PushDown(int root, int lt, int rt) {
if (node[root].lazy) {
node[ls(root)].minn += node[root].lazy;
node[ls(root)].maxx += node[root].lazy;
node[ls(root)].lazy += node[root].lazy;
node[rs(root)].minn += node[root].lazy;
node[rs(root)].maxx += node[root].lazy;
node[rs(root)].lazy += node[root].lazy;
node[root].lazy = 0;
}
}
void AddSeq(int root, int lt, int rt, int lq, int rq, int val) {
if (lt == lq && rt == rq) {
node[root].minn += 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);
}
}
int Query(SegmentTree X, int root, int lt, int rt, int lq, int rq) {
if (lt == lq && rt == rq) {
if (node[root].maxx < X.node[root].minn) return 0;
if (lt == rt) return node[root].maxx / X.node[root].maxx;
}
int mid = lt + ((rt - lt) >> 1);
if (rq <= mid) {
return Query(X, ls(root), lt, mid, lq, rq);
} else if (lq > mid) {
return Query(X, rs(root), mid + 1, rt, lq, rq);
} else {
return Query(X, ls(root), lt, mid, lq, mid) + Query(X, rs(root), mid + 1, rt, mid + 1, rq);
}
}
};
SegmentTree A, B;
void Work2() {
B.Build(1, 1, n);
while (q--) {
char op[10];
int l, r;
scanf("%s %d %d", op, &l, &r);
if (op[0] == 'a') {
A.AddSeq(1, 1, n, l, r, 1);
} else {
printf("%d\n", A.Query(B, 1, 1, n, l, r));
}
}
}
void Work1() {
while (q--) {
char op[10];
int l, r;
scanf("%s %d %d", op, &l, &r);
if (op[0] == 'a') {
for (int i = l; i <= r; ++i) ++a[i];
} else {
int ans = 0;
for (int i = l; i <= r; ++i) ans += a[i] / b[i];
printf("%d\n", ans);
}
}
}
int main() {
freopen("eta.in", "r", stdin);
freopen("eta.out", "w", stdout);
scanf("%d %d", &n, &q);
for (int i = 1; i <= n; ++i) {
scanf("%d", &b[i]);
}
if (n <= 30000) {
Work1();
} else {
Work1();
}
return 0;
}