求助(玄关)

P3372 【模板】线段树 1

ycy1124 @ 2024-06-24 10:25:05

#include<bits/stdc++.h>
using namespace std;
struct Node{
    long long l,r,bj,w;
}a[2000001];
long long b[500001];
void work(int p,int l,int r){
    int mid=(l+r)>>1;
    a[p].l=l;
    a[p].r=r;
    if(l==r){
        a[p].w=b[l];
        return;
    }
    work(p*2,l,mid);
    work(p*2+1,mid+1,r);
    a[p].w=a[p*2].w+a[p*2+1].w;
}
int ans(int p,int l,int r,int x,int y){
    int mid=(l+r)>>1;
    a[p].w+=(r-l+1)*a[p].bj;
    a[p*2].bj=a[p].bj;
    a[p*2+1].bj=a[p].bj;
    a[p].bj=0;
    if(l>=x&&r<=y){
        return a[p].w;
    }
    if(y<=mid){
        return ans(p*2,l,mid,x,y);
    }
    else if(x>mid){
        return ans(p*2+1,mid+1,r,x,y);
    }
    else{
        return ans(p*2,l,mid,x,y)+ans(p*2+1,mid+1,r,x,y);
    }
} 
void work1(int p,int l,int r,int x,int y,int k){
    int mid=(l+r)>>1;
    if(x<=l&&y>=r){
        a[p].bj+=k;
        return;
    }
    a[p].w+=(min(y,r)-max(x,l)+1)*k;
    if(x>mid){
        work1(p*2+1,mid+1,r,x,y,k);
    }
    else if(y<=mid){
        work1(p*2,l,mid,x,y,k);
    }
    else{
        work1(p*2,l,mid,x,y,k);
        work1(p*2+1,mid+1,r,x,y,k);
    }
}
void read(long long &x){
    x=0;
    int f=1;char ch=getchar();
    while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
    x*=f;
}
int main(){
    long long n,m;
    read(n);
    read(m);
    for(int i=1;i<=n;i++){
        read(b[i]);
    }
    work(1,1,n);
    for(int i=1;i<=m;i++){
        long long ch,x,y,k;
        read(ch);
        if(ch==1){
            read(x);
            read(y);
            read(k);
            work1(1,1,n,x,y,k);
        }
        else{
            read(x);
            read(y);
            printf("%lld\n",ans(1,1,n,x,y));
        }
    }
    return 0;
}

by ycy1124 @ 2024-06-24 10:32:31

#include<bits/stdc++.h>
using namespace std;
struct Node{
    long long int l,r,bj,w;
}a[2000001];
long long int b[500001];
void work(int p,int l,int r){
    int mid=(l+r)>>1;
    a[p].l=l;
    a[p].r=r;
    if(l==r){
        a[p].w=b[l];
        return;
    }
    work(p*2,l,mid);
    work(p*2+1,mid+1,r);
    a[p].w=a[p*2].w+a[p*2+1].w;
}
int ans(int p,int l,int r,int x,int y){
    int mid=(l+r)>>1;
    a[p].w+=(r-l+1)*a[p].bj;
    a[p*2].bj+=a[p].bj;
    a[p*2+1].bj+=a[p].bj;
    a[p].bj=0;
    if(l>=x&&r<=y){
        return a[p].w;
    }
    if(y<=mid){
        return ans(p*2,l,mid,x,y);
    }
    else if(x>mid){
        return ans(p*2+1,mid+1,r,x,y);
    }
    else{
        return ans(p*2,l,mid,x,y)+ans(p*2+1,mid+1,r,x,y);
    }
} 
void work1(int p,int l,int r,int x,int y,int k){
    int mid=(l+r)>>1;
    if(x<=l&&y>=r){
        a[p].bj+=k;
        return;
    }
    a[p].w+=(min(y,r)-max(x,l)+1)*k;
    if(x>mid){
        work1(p*2+1,mid+1,r,x,y,k);
    }
    else if(y<=mid){
        work1(p*2,l,mid,x,y,k);
    }
    else{
        work1(p*2,l,mid,x,y,k);
        work1(p*2+1,mid+1,r,x,y,k);
    }
}
void read(long long &x){
    x=0;
    int f=1;char ch=getchar();
    while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
    x*=f;
}
int main(){
    long long int n,m;
    read(n);
    read(m);
    for(int i=1;i<=n;i++){
        read(b[i]);
    }
    work(1,1,n);
    for(int i=1;i<=m;i++){
        long long int ch,x,y,k;
        read(ch);
        if(ch==1){
            read(x);
            read(y);
            read(k);
            work1(1,1,n,x,y,k);
        }
        else{
            read(x);
            read(y);
            printf("%lld\n",ans(1,1,n,x,y));
        }
    }
    return 0;
}

70pts


by CbrX @ 2024-06-24 10:44:02

ans函数怎么用int返回值


by O_v_O @ 2024-06-24 10:48:11

你的函数 ans 的返回值应该时 long long,不然会爆。

代码:

#include<bits/stdc++.h>
using namespace std;
struct Node{
    long long int l,r,bj,w;
}a[2000001];
long long int b[500001];
void work(int p,int l,int r){
    int mid=(l+r)>>1;
    a[p].l=l;
    a[p].r=r;
    if(l==r){
        a[p].w=b[l];
        return;
    }
    work(p*2,l,mid);
    work(p*2+1,mid+1,r);
    a[p].w=a[p*2].w+a[p*2+1].w;
}
long long ans(int p,int l,int r,int x,int y){
    int mid=(l+r)>>1;
    a[p].w+=(r-l+1)*a[p].bj;
    a[p*2].bj+=a[p].bj;
    a[p*2+1].bj+=a[p].bj;
    a[p].bj=0;
    if(l>=x&&r<=y){
        return a[p].w;
    }
    if(y<=mid){
        return ans(p*2,l,mid,x,y);
    }
    else if(x>mid){
        return ans(p*2+1,mid+1,r,x,y);
    }
    else{
        return ans(p*2,l,mid,x,y)+ans(p*2+1,mid+1,r,x,y);
    }
} 
void work1(int p,int l,int r,int x,int y,int k){
    int mid=(l+r)>>1;
    if(x<=l&&y>=r){
        a[p].bj+=k;
        return;
    }
    a[p].w+=(min(y,r)-max(x,l)+1)*k;
    if(x>mid){
        work1(p*2+1,mid+1,r,x,y,k);
    }
    else if(y<=mid){
        work1(p*2,l,mid,x,y,k);
    }
    else{
        work1(p*2,l,mid,x,y,k);
        work1(p*2+1,mid+1,r,x,y,k);
    }
}
void read(long long &x){
    x=0;
    int f=1;char ch=getchar();
    while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
    x*=f;
}
int main(){
    long long int n,m;
    read(n);
    read(m);
    for(int i=1;i<=n;i++){
        read(b[i]);
    }
    work(1,1,n);
    for(int i=1;i<=m;i++){
        long long int ch,x,y,k;
        read(ch);
        if(ch==1){
            read(x);
            read(y);
            read(k);
            work1(1,1,n,x,y,k);
        }
        else{
            read(x);
            read(y);
            printf("%lld\n",ans(1,1,n,x,y));
        }
    }
    return 0;
}

by ycy1124 @ 2024-06-24 10:51:13

@CbrX @woshishadanda 哦,谢谢两位大佬,本人眼瞎,已关


|