全RE求调
查看原帖
全RE求调
1013950
__youzimo2014__楼主2025/2/3 16:28

线段树应该没问题,把代码交到模板上可过。

#include <iostream>
using namespace std;
typedef long long ll;
struct Nod {
    ll data, tag;
    int num;
} tree[400005];
int n, m;
ll a[100005], f[100005];
void push_up(int id) {
    tree[id].data = tree[id << 1].data + tree[id << 1 | 1].data;
}
void push_down(int id) {
    tree[id << 1].data += tree[id].tag * tree[id << 1].num;
    tree[id << 1].tag += tree[id].tag;
    tree[id << 1 | 1].data += tree[id].tag * tree[id << 1 | 1].num;
    tree[id << 1 | 1].tag += tree[id].tag;

    tree[id].tag = 0;
}
void build(int l, int r, int id) {
    if (l == r) {
        tree[id].data = f[l];
        tree[id].num = 1;
        return;
    }
    int mid = (l + r) / 2;
    build(l, mid, id << 1);
    build(mid + 1, r, id << 1 | 1);
    push_up(id);
    tree[id].num = tree[id << 1].num + tree[id << 1 | 1].num;
}
ll query(int ql, int qr, int l, int r, int id) {
    if (ql <= l && r <= qr) return tree[id].data;
    push_down(id);
    int mid = (l + r) / 2;
    ll ans = 0;
    if (ql <= mid) ans += query(ql, qr, l, mid, id << 1);
    if (mid < qr) ans += query(ql, qr, mid + 1, r, id << 1 | 1);
    return ans;
}
void update(int ql, int qr, int l, int r, int id, ll k) {
    if (ql <= l && r <= qr) {
        tree[id].data += tree[id].num * k;
        tree[id].tag += k;
        return;
    }
    push_down(id);
    int mid = (l + r) / 2;
    if (ql <= mid) update(ql, qr, l, mid, id << 1, k);
    if (mid < qr) update(ql, qr, mid + 1, r, id << 1 | 1, k);
    push_up(id);
}
int main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    for (int i = 1; i <= n; i++) {
        f[i] = a[i] - a[i - 1];
    }
    build(1, n, 1);
    while (m--) {
        int opt;
        cin >> opt;
        if (opt == 1) {
            int l, r, k, d;
            cin >> l >> r >> k >> d;
            int end = k + (r - l) * d;
            update(l, l, 1, n, 1, k);
            if (l < r) update(l + 1, r, 1, n, 1, d);
            if (r < n) update(r + 1, r + 1, 1, n, 1, -end);
        } else {
            int p;
            cin >> p;
            int ans = 0;
            cout << query(1, p, 1, n, 1) << endl;
        }
    }
    return 0;
}
2025/2/3 16:28
加载中...