1 条题解

  • 0
    @ 2024-10-8 21:51:02

    线段树

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 1e6 + 10, INF = 0x3f3f3f3f;
    int n, m, q, a[N];
    
    struct Node {
        int l, r;
        ll mx, sum;
    } tr[N << 2];
    
    void pushup(Node& u, Node& l, Node& r) {
        u.sum = (l.sum + r.sum);
        u.mx = max(l.mx, r.mx);
    }
    void pushup(int u) {
        pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
    }
    void pushdown(int u) {}
    void build(int u, int l, int r) {
        tr[u] = {l, r, 0, 0};
        if (l == r) {
            tr[u].mx = tr[u].sum = a[l]; return;
        }
        int mid = l + r >> 1;
        build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
        pushup(u);
    }
    void modify2(int u, int l, int r, ll x) {
        // printf("modify2: %d %d %d\n",u,l,r);
        if (tr[u].mx < x) return;
        if (tr[u].l == tr[u].r) {
            tr[u].mx %= x;
            tr[u].sum %= x; return;
        }
        int mid = tr[u].l + tr[u].r >> 1;
        if (l <= mid) modify2(u << 1, l, r, x);
        if (r > mid) modify2(u << 1 | 1, l, r, x);
        pushup(u);
    }
    void modify3(int u, int l,int r, ll x) {
        // printf("modify3: %d %d %d\n",u,l,r);
        if (tr[u].l == tr[u].r) {
            if(l==tr[u].l) tr[u].mx = tr[u].sum = x; 
            return;
        }
        int mid = tr[u].l + tr[u].r >> 1;
        if (l <= mid) modify3(u << 1, l, r, x);
        if (r > mid) modify3(u << 1 | 1, l, r, x);
        pushup(u);
    }
    Node query(int u, int l, int r) {
        // printf("query: %d %d %d\n",u,l,r);
        if (l <= tr[u].l && r >= tr[u].r) return tr[u];
        int mid = tr[u].l + tr[u].r >> 1;
        Node res, left = {0, 0, 0, 0}, right = {0, 0, 0, 0};
        if (l <= mid) left = query(u << 1, l, r);
        if (r > mid) right = query(u << 1 | 1, l, r);
        pushup(res, left, right);
        return res;
    }
    
    int main() {
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
        build(1, 1, n); int op, l, r, x;
        while (m--) {
            scanf("%d%d%d", &op, &l, &r);
            if (op == 2) scanf("%d", &x);
            if (op == 1) printf("%lld\n", query(1, l, r).sum);
            if (op == 2) modify2(1, l, r, x);
            if (op == 3) modify3(1, l, l, r);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1684
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    6
    已通过
    2
    上传者