不知道怎么复制代码自动对齐,建议复制后找个软件自动对齐
不知道代码那错了,才学,但视频中代码不全,有一段代码自己补的。
样例
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;}
你提供的代码存在一些问题:
在代码开头,包含了 <bits/stdc++.h>
头文件,这是非标准的写法,不建议使用。正确的做法是包含相应的标准头文件,例如 <iostream>
、<vector>
、<algorithm>
等。
代码中存在一些不必要的空格和换行,影响了代码的可读性。
函数 pushdown
中的语句有误,应将 tree[u<<1].sum
和 tree[u<<1|1].sum
改为 tree[u<<1].lazy
和 tree[u<<1|1].lazy
。
函数 change
中的 tree[u].sum += (tree[u].r - tree[u].l + 1) * k;
应该改为 tree[u].sum += (tree[u].r - tree[u].l + 1) * k;
。
函数 query
中的条件 if(l<=tree[u].l && tree[u].r)
应改为 if(l<=tree[u].l && r>=tree[u].r)
。
在 query
函数的递归调用中,应该返回 res
,而不是 return query(u<<1,l,r);
。
在主函数中,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
输入时,请确保输入的数据符合题目要求的范围。