如题
昨天在机房用 vscode 写 c++
然后忘记关 github copilot 发现他居然能写 oi 题
今天过了几题之后想写个线段树
然后我打了如下代码
#include ...
...
...
int total;
int ls
然后他就给我生成好了
int ls(int x) {
return x << 1;
}
int rs(int x) {
return x << 1 | 1;
}
然后我打了
struct segmentTree {
过了十秒 线段树就好了
struct segmentTree {
int n;
int a[N];
int tree[N << 2];
int lazy[N << 2];
void build(int x, int l, int r) {
if (l == r) {
tree[x] = a[l];
return;
}
int mid = (l + r) >> 1;
build(ls(x), l, mid);
build(rs(x), mid + 1, r);
tree[x] = tree[ls(x)] + tree[rs(x)];
}
void pushdown(int x, int l, int r) {
if (lazy[x] == 0) return;
if (l != r) {
int mid = (l + r) >> 1;
tree[ls(x)] += (mid - l + 1) * lazy[x];
tree[rs(x)] += (r - mid) * lazy[x];
lazy[ls(x)] += lazy[x];
lazy[rs(x)] += lazy[x];
}
lazy[x] = 0;
}
void modify(int x, int l, int r, int ql, int qr, int val) {
if (ql <= l && r <= qr) {
tree[x] += (r - l + 1) * val;
if (l != r) {
int mid = (l + r) >> 1;
tree[ls(x)] += (mid - l + 1) * val;
tree[rs(x)] += (r - mid) * val;
lazy[ls(x)] += val;
lazy[rs(x)] += val;
}
return;
}
pushdown(x, l, r);
int mid = (l + r) >> 1;
if (ql <= mid) modify(ls(x), l, mid, ql, qr, val);
if (qr > mid) modify(rs(x), mid + 1, r, ql, qr, val);
tree[x] = tree[ls(x)] + tree[rs(x)];
}
int query(int x, int l, int r, int ql, int qr) {
if (ql <= l && r <= qr) return tree[x];
pushdown(x, l, r);
int mid = (l + r) >> 1;
int ret = 0;
if (ql <= mid) ret += query(ls(x), l, mid, ql, qr);
if (qr > mid) ret += query(rs(x), mid + 1, r, ql, qr);
return ret;
}
} seg;
甚至还有主函数
signed main() {
int n;
scanf("%lld", &n);
int m;
scanf("%lld", &m);
for (int i = 1; i <= n; i++) {
scanf("%lld", &seg.a[i]);
}
seg.n = n;
seg.build(1, 1, n);
for (int i = 1; i <= m; i++) {
int l, r;
scanf("%lld%lld", &l, &r);
int ans = seg.query(1, 1, n, l, r);
printf("%lld\n", ans);
}
return 0;
}
然后我改了一下输入输出符合题目要求
signed main() {
int n;
scanf("%lld", &n);
int m;
scanf("%lld", &m);
for (int i = 1; i <= n; i++) {
scanf("%lld", &seg.a[i]);
}
seg.n = n;
seg.build(1, 1, n);
for (int i = 1; i <= m; i++) {
int op, k;
int l, r;
scanf("%lld", &op);
if (op == 1) {
scanf("%lld%lld%lld", &l, &r, &k);
seg.modify(1, 1, n, l, r, k);
} else {
scanf("%lld%lld", &l, &r);
int ans = seg.query(1, 1, n, l, r);
printf("%lld\n", ans);
}
}
return 0;
}
然后就 A 了
https://www.luogu.com.cn/record/35923439
全过程大概用时 1min(包括觉得人工智能牛逼的时间)