社区讨论

是我写对了还是数据水了

学术版参与者 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 条回复,欢迎继续交流。

正在加载回复...