社区讨论
线段树求调
P3372【模板】线段树 1参与者 4已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @lo8b7vjb
- 此快照首次捕获于
- 2023/10/27 15:46 2 年前
- 此快照最后确认于
- 2023/10/27 15:46 2 年前
CPP
#include<bits/stdc++.h>
#define N 100086
using namespace std;
struct name {
int num,left,right;
} tree[N];
int in[N],ans;
int add(int x) {
if(tree[x].left==tree[x].right) {
tree[x].num=in[tree[x].right];
return tree[x].num;
}
tree[x].num=add(x*2)+add(x*2+1);
return tree[x].num;
}
void build(int x,int left,int right) {
tree[x].left=left,tree[x].right=right;
if(left==right)return ;
int mid=(left+right)>>1;
build(x*2,left,mid);
build(x*2+1,mid+1,right);
}
void qjcx(int x,int left,int right) {
if(tree[x].left>=left&&tree[x].right<=right) {
ans+=tree[x].num;
return ;
}
if(tree[x*2].right>=left)
qjcx(x*2,left,right);
if(tree[x*2+1].left<=right)
qjcx(x*2+1,left,right);
}
void qjxg(int x,int l,int r,int k) {
if(tree[x].left>=l&&tree[x].right<=r) {
tree[x].num+=k;
return ;
}
if(tree[x*2].right>=l)
qjxg(x*2,l,r,k);
if(tree[x*2+1].left<=r)
qjxg(x*2+1,l,r,k);
}
int n,m,a,x,y,k;
int main() {
cin>>n>>m;
for(int i=1; i<=n; i++) {
cin>>in[i];
}
build(1,1,n);
add(1);
for(int i=1; i<=m; i++) {
cin>>a>>x>>y;
if(a==1) {
cin>>k;
qjxg(1,x,y,k);
} else {
ans=0;
qjcx(1,x,y);
cout<<ans<<'\n';
}
}
return 0;
}
样例第三个20输出12,全wa
回复
共 10 条回复,欢迎继续交流。
正在加载回复...