[Github Copilot]人工智能写线段树
查看原帖
[Github Copilot]人工智能写线段树
224978
optimize_2楼主2022/3/20 19:24

如题

昨天在机房用 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(包括觉得人工智能牛逼的时间)

2022/3/20 19:24
加载中...