线段数 洛谷3372 不知道代码哪错了

不知道怎么复制代码自动对齐,建议复制后找个软件自动对齐
不知道代码那错了,才学,但视频中代码不全,有一段代码自己补的。

样例
5 5

1 5 4 2 3

2 2 4

1 2 3 2
2 3 4
1 1 5 1
2 1 4
我的结果
14
11
24
正确答案
11

8
20
我的代码:
#include <bits/stdc++.h>using namespace std;#define ll long longconst int mod =100005;const int N=mod;ll a[N] ;struct node //建立点{ int l,r; ll lazy; ll sum;}tree[N<<2];void pushup(int u) //维护{ tree[u].sum =tree[u<<1].sum+tree[u<<1|1].sum;}void build(int u,int l,int r) //建树{ tree[u].l=l; tree[u].r=r; if(l==r) { tree[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 pushdown(int u) //暂时有误{ if(tree[u].lazy!=0) { tree[u<<1].lazy+=tree[u].lazy; tree[u<<1].sum+=(tree[u<<1].r-tree[u<<1].l+1)*tree[u<<1].sum ; //左 tree[u<<1|1].lazy+=tree[u].lazy; tree[u<<1|1].sum+=(tree[u<<1|1].r-tree[u<<1|1].l+1)*tree[u<<1|1].sum ;//右 tree[u].lazy=0; }}void change( int u,int l,int r,ll k) //区间修改{ if (l <= tree[u].l && r >= tree[u].r) { tree[u].lazy += k; tree[u].sum += (tree[u].r - tree[u].l + 1)k;//子节点个数k return; } pushdown(u); int mid = (tree[u].l + tree[u].r) >> 1; if (l <= mid) change(u << 1, l, r, k); if (r > mid) change(u << 1 | 1, l, r, k); pushup(u);}ll query(int u,int l,int r)//区间查询{ if(l<=tree[u].l && tree[u].r) { return tree[u].sum; } pushdown(u); int mid = (tree[u].l + tree[u].r) >> 1; ll res=0; if (l <= mid) res+= query(u<<1,l,r); if (r > mid) res+= query(u<<1|1,l,r); return res;};int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i]; } build(1,1,n); while(m--)//询问m次 { int t; cin>>t; if(t==1) { int l,r; ll k; cin>>l>>r>>k; change(1,l,r,k); } else { int l,r; cin>>l>>r; ll w=0; w+= query(1,l,r); cout<<w<<endl; } } return 0;}

你提供的代码存在一些问题:

  1. 在代码开头,包含了 <bits/stdc++.h> 头文件,这是非标准的写法,不建议使用。正确的做法是包含相应的标准头文件,例如 <iostream><vector><algorithm> 等。

  2. 代码中存在一些不必要的空格和换行,影响了代码的可读性。

  3. 函数 pushdown 中的语句有误,应将 tree[u<<1].sumtree[u<<1|1].sum 改为 tree[u<<1].lazytree[u<<1|1].lazy

  4. 函数 change 中的 tree[u].sum += (tree[u].r - tree[u].l + 1) * k; 应该改为 tree[u].sum += (tree[u].r - tree[u].l + 1) * k;

  5. 函数 query 中的条件 if(l<=tree[u].l && tree[u].r) 应改为 if(l<=tree[u].l && r>=tree[u].r)

  6. query 函数的递归调用中,应该返回 res,而不是 return query(u<<1,l,r);

  7. 在主函数中,cin>>n>>m; 后没有检查输入的合法性,如果输入的值超出范围可能会导致问题。

以下是修正后的代码:

#include <iostream>
using namespace std;

#define ll long long
const int mod = 100005;
const int N = mod;
ll a[N];

struct node {
    int l, r;
    ll lazy;
    ll sum;
} tree[N << 2];

void pushup(int u) {
    tree[u].sum = tree[u << 1].sum + tree[u << 1 | 1].sum;
}

void build(int u, int l, int r) {
    tree[u].l = l;
    tree[u].r = r;
    if (l == r) {
        tree[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 pushdown(int u) {
    if (tree[u].lazy != 0) {
        tree[u << 1].lazy += tree[u].lazy;
        tree[u << 1].sum += (tree[u << 1].r - tree[u << 1].l + 1) * tree[u].lazy;
        tree[u << 1 | 1].lazy += tree[u].lazy;
        tree[u << 1 | 1].sum += (tree[u << 1 | 1].r - tree[u << 1 | 1].l + 1) * tree[u].lazy;
        tree[u].lazy = 0;
    }
}

void change(int u, int l, int r, ll k) {
    if (l <= tree[u].l && r >= tree[u].r) {
        tree[u].lazy += k;
        tree[u].sum += (tree[u].r - tree[u].l + 1) * k;
        return;
    }
    pushdown(u

);
    int mid = (tree[u].l + tree[u].r) >> 1;
    if (l <= mid)
        change(u << 1, l, r, k);
    if (r > mid)
        change(u << 1 | 1, l, r, k);
    pushup(u);
}

ll query(int u, int l, int r) {
    if (l <= tree[u].l && r >= tree[u].r) {
        return tree[u].sum;
    }
    pushdown(u);
    int mid = (tree[u].l + tree[u].r) >> 1;
    ll res = 0;
    if (l <= mid)
        res += query(u << 1, l, r);
    if (r > mid)
        res += query(u << 1 | 1, l, r);
    return res;
}

int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    build(1, 1, n);
    while (m--) {
        int t;
        cin >> t;
        if (t == 1) {
            int l, r;
            ll k;
            cin >> l >> r >> k;
            change(1, l, r, k);
        } else {
            int l, r;
            cin >> l >> r;
            ll w = 0;
            w += query(1, l, r);
            cout << w << endl;
        }
    }
    return 0;
}

这样修改后的代码应该能够正常运行,并输出正确的结果。注意,在使用 cin 输入时,请确保输入的数据符合题目要求的范围。