求助,两份逻辑几乎完全相同的代码,必关
查看原帖
求助,两份逻辑几乎完全相同的代码,必关
1378642
ETO_NOI楼主2025/7/29 22:00

60pts:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[1000009],n,op,q,x,y,k;
struct tr{
    int maxn,laz,l,r,xg = 1e18 + 1;
}tree[4000009];
void pushdown(int id){
    if(tree[id].xg != 1e18 + 1){
        tree[id * 2 + 1].maxn = tree[id * 2].maxn = tree[id].xg;
        tree[id * 2 + 1].xg = tree[id * 2].xg = tree[id].xg;
        tree[id].xg = 1e18 + 1;
        tree[id * 2].laz = tree[id * 2 + 1].laz = 0;
        return;
    }
    tree[id * 2].maxn += tree[id].laz;
    tree[id * 2].laz += tree[id].laz;
    tree[id * 2 + 1].maxn += tree[id].laz;
    tree[id * 2 + 1].laz += tree[id].laz;
    tree[id].laz = 0;
}
void build(int id,int l,int r){
    tree[id].l = l,tree[id].r = r;
    if(l == r){
        tree[id].maxn = a[l];
        return;
    }
    int mid = (l + r) / 2;
    build(id * 2,l,mid);
    build(id * 2 + 1,mid + 1,r);
    tree[id].maxn = max(tree[id * 2].maxn,tree[id * 2 + 1].maxn);
}
int quest(int id,int l,int r){
    if(l <= tree[id].l && tree[id].r <= r){
        return tree[id].maxn;
    }
    int mid = (tree[id].l + tree[id].r) / 2,maxx = -1e18;
    pushdown(id);
    if(l <= mid){
        maxx = max(maxx,quest(id * 2,l,r));
    }
    if(mid + 1 <= r){
        maxx = max(maxx,quest(id * 2 + 1,l,r));
    }
    return maxx;
}
void add(int id,int s,int t,int k){
    if(s <= tree[id].l && tree[id].r <= t){
        if(tree[id].xg == 1e18 + 1){
            tree[id].maxn += k;
            tree[id].laz += k;
            return;
        }
        else{
            tree[id].xg += k;
            tree[id].maxn += k;
            return;
        }
    }
    pushdown(id);
    int mid = (tree[id].l + tree[id].r) / 2;
    if(s <= mid){
        add(id * 2,s,t,k);
    }
    if(mid + 1 <= t){
        add(id * 2 + 1,s,t,k);
    }
    tree[id].maxn = max(tree[id * 2].maxn,tree[id * 2 + 1].maxn);
}
void dda(int id,int s,int t,int k){
    if(s <= tree[id].l && tree[id].r <= t){
        tree[id].maxn = k;
        tree[id].xg = k;
        tree[id].laz = 0;
        return;
    }
    pushdown(id);
    int mid = (tree[id].l + tree[id].r) / 2;
    if(s <= mid){
        dda(id * 2,s,t,k);
    }
    if(mid + 1 <= t){
        dda(id * 2 + 1,s,t,k);
    }
    tree[id].maxn = max(tree[id * 2].maxn,tree[id * 2 + 1].maxn);
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> q;
    for(int i = 1;i <= n;i++){
        cin >> a[i];
    }
    build(1,1,n);
    while(q--){
        cin >> op;
        if(op == 1){
            cin >> x >> y >> k;
            dda(1,x,y,k);
        }
        else if(op == 2){
            cin >> x >> y >> k;
            add(1,x,y,k);
        }
        else{
            cin >> x >> y;
            cout << quest(1,x,y) << '\n';
        }
    }
    return 0;
}

100pts:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int INF = LLONG_MAX;
int a[1000009], n, op, q, x, y, k;

struct tr {
    int maxn, laz, l, r, xg = INF;
} tree[4000009];

void pushdown(int id) {
    if (tree[id].xg != INF) {
        tree[id * 2].maxn = tree[id * 2 + 1].maxn = tree[id].xg;
        tree[id * 2].xg = tree[id * 2 + 1].xg = tree[id].xg;
        tree[id * 2].laz = tree[id * 2 + 1].laz = 0;
        tree[id].xg = INF;
    }
    if (tree[id].laz != 0) {
        tree[id * 2].maxn += tree[id].laz;
        tree[id * 2 + 1].maxn += tree[id].laz;
        tree[id * 2].laz += tree[id].laz;
        tree[id * 2 + 1].laz += tree[id].laz;
        tree[id].laz = 0;
    }
}

void build(int id, int l, int r) {
    tree[id].l = l, tree[id].r = r;
    if (l == r) {
        tree[id].maxn = a[l];
        return;
    }
    int mid = (l + r) / 2;
    build(id * 2, l, mid);
    build(id * 2 + 1, mid + 1, r);
    tree[id].maxn = max(tree[id * 2].maxn, tree[id * 2 + 1].maxn);
}

int quest(int id, int l, int r) {
    if (l <= tree[id].l && tree[id].r <= r) {
        return tree[id].maxn;
    }
    pushdown(id);
    int mid = (tree[id].l + tree[id].r) / 2, maxx = -INF;
    if (l <= mid) {
        maxx = max(maxx, quest(id * 2, l, r));
    }
    if (mid + 1 <= r) {
        maxx = max(maxx, quest(id * 2 + 1, l, r));
    }
    return maxx;
}

void add(int id, int s, int t, int k) {
    if (s <= tree[id].l && tree[id].r <= t) {
        if (tree[id].xg == INF) {
            tree[id].maxn += k;
            tree[id].laz += k;
        } else {
            tree[id].xg += k;
            tree[id].maxn += k;
        }
        return;
    }
    pushdown(id);
    int mid = (tree[id].l + tree[id].r) / 2;
    if (s <= mid) {
        add(id * 2, s, t, k);
    }
    if (mid + 1 <= t) {
        add(id * 2 + 1, s, t, k);
    }
    tree[id].maxn = max(tree[id * 2].maxn, tree[id * 2 + 1].maxn);
}

void dda(int id, int s, int t, int k) {
    if (s <= tree[id].l && tree[id].r <= t) {
        tree[id].maxn = k;
        tree[id].xg = k;
        tree[id].laz = 0;
        return;
    }
    pushdown(id);
    int mid = (tree[id].l + tree[id].r) / 2;
    if (s <= mid) {
        dda(id * 2, s, t, k);
    }
    if (mid + 1 <= t) {
        dda(id * 2 + 1, s, t, k);
    }
    tree[id].maxn = max(tree[id * 2].maxn, tree[id * 2 + 1].maxn);
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> q;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    build(1, 1, n);
    while (q--) {
        cin >> op;
        if (op == 1) {
            cin >> x >> y >> k;
            dda(1, x, y, k);
        } else if (op == 2) {
            cin >> x >> y >> k;
            add(1, x, y, k);
        } else {
            cin >> x >> y;
            cout << quest(1, x, y) << '\n';
        }
    }
    return 0;
}

第二份代码是AI改的,感觉逻辑没有区别,每一个不同也都改上了,但是依然60pts,有大佬帮助必关

2025/7/29 22:00
加载中...