社区讨论
是我写对了还是数据水了
学术版参与者 3已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mid7he8n
- 此快照首次捕获于
- 2025/11/24 21:52 3 个月前
- 此快照最后确认于
- 2025/11/24 22:02 3 个月前
下面乃我唐人线段树1 AC 代码
结果update和query的到左右儿子的操作写的很假(不算mid)还能AC
用教练的原话说,不算mid还能过?
CPP// Gavinzhou's code
#include<bits/stdc++.h>
using namespace std;
//#define nottest
#define in freopen("xx.in","r",stdin)
#define out freopen("xx.out","w",stdout)
#define int long long
#define Abs(x) ((x)<0?-(x):(x))
#define Max(a, b) ((a)>(b)?(a):(b))
#define Min(a, b) ((a)<(b)?(a):(b))
#define fir first
#define sec second
#define dis(x1,y1,x2,y2) (sqrt(Abs(x1-x2)*Abs(x1-x2)+Abs(y1-y2)*Abs(y1-y2)))
using intint=pair<int,int>;
using str=string;
const int N=1e5+5;
int a[N];
struct Node{
int l,r;
int sum,lt;
};
Node tree[4*N];
int n,m;
void build(int node=1,int l=1,int r=n){
tree[node].l=l,tree[node].r=r;
if(l==r){
tree[node].sum=a[l];
return ;
}
int mid=(l+r)>>1;
build(node<<1,l,mid);
build(node<<1|1,mid+1,r);
tree[node].sum=tree[node<<1].sum+tree[node<<1|1].sum;
}
void push_down(int node){
if(tree[node].lt!=0){
int l=node<<1;
int r=node<<1|1;
int lt=tree[node].lt;
tree[l].sum+=lt*(tree[l].r-tree[l].l+1);
tree[r].sum+=lt*(tree[r].r-tree[r].l+1);
tree[l].lt+=lt;
tree[r].lt+=lt;
tree[node].lt=0;
}
}
void change(int node,int l,int r,int k){
if(tree[node].l>=l&&tree[node].r<=r){
tree[node].lt+=k;
tree[node].sum+=(tree[node].r-tree[node].l+1)*k;
return ;
}
push_down(node);
if(tree[node<<1].r>=l){//不算mid能过
change(node<<1,l,r,k);
}
if(tree[node<<1|1].l<=r){
change(node<<1|1,l,r,k);
}
tree[node].sum=tree[node<<1].sum+tree[node<<1|1].sum;
}
int query(int node,int l,int r){
if(tree[node].l>=l&&tree[node].r<=r){
return tree[node].sum;
}
push_down(node);
int res=0;
if(tree[node<<1].r>=l){//这里也是
res+=query(node<<1,l,r);
}
if(tree[node<<1|1].l<=r){
res+=query(node<<1|1,l,r);
}
return res;
}
signed main(){
#ifdef nottest
in;
out;
#endif
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
build();
while(m--){
int op,x,y;
cin>>op>>x>>y;
if(op==1){
int k;
cin>>k;
change(1,x,y,k);
}else{
cout<<query(1,x,y)<<endl;
}
}
return 0;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...