70分求调

P3372 【模板】线段树 1

ymw123456 @ 2024-08-07 13:20:51

线段树写法,后三个数据WA了测评记录

代码

#include <bits/stdc++.h>
using namespace std;
struct no{
    int l,r,b,h;
}a[500005];
int b[100005];
void build(int z,int l,int r){
    a[z].l=l;
    a[z].r=r;
    if(l==r){
        a[z].h=b[l];
        return ;
    }else{
        long long mid=l+r>>1;
        build(z*2,l,mid);
        build(z*2+1,mid+1,r);
        a[z].h=a[z*2].h+a[z*2+1].h;
        return ;
    }
}
void dow(int z){
    if(a[z].b!=0){
        a[z*2].b+=a[z].b;
        a[z*2+1].b+=a[z].b;
        long long mid=(a[z].l+a[z].r)/2;
        a[z*2].h+=a[z].b*(mid-a[z*2].l+1);
        a[z*2+1].h+=a[z].b*(a[z*2+1].r-mid);
        a[z].b=0;
    }
    return ;
}
int find(int z,int l,int r){
    if(l<=a[z].l&&a[z].r<=r){
        return a[z].h;
    }
    if(a[z].r<l || a[z].l>r){
        return 0;
    }
    dow(z);
    //long long mid=(a[z].l+a[z].r)/2;
    int s=0;
    if(a[z*2].r>=l){
        s+=find(z*2,l,r);
    }  
    if(a[z*2+1].l<=r){
        s+=find(z*2+1,l,r);
    }  
    return s;
}
int add(int z,int l,int r,int k){
    if(l<=a[z].l&&a[z].r<=r){
        a[z].b+=k;
        a[z].h+=k*(a[z].r-a[z].l+1);
        return 0;
    }
    dow(z);
    long long mid=(a[z].l+a[z].r)/2;
    if(a[z*2].r>=l){
        add(z*2,l,r,k);
    }  
    if(a[z*2+1].l<=r){
        add(z*2+1,l,r,k);
    }
    a[z].h=a[z*2].h+a[z*2+1].h;
    return  0;
}

int  main(){
//  freopen("a.in","r",stdin);
//  freopen("a.out","w",stdout);
    long long n,m;
    scanf("%lld%lld",&n,&m);
    for(long long i=1;i<=n;i++){
        scanf("%lld",&b[i]);
    }
    build(1,1,n);
//  for(int i=0;i<4*n;i++){
//      printf("%d %d %d \n",a[i].l,a[i].r,a[i].h);
//  }
    for(long long i=1;i<=m;i++){
        long long ac;
        scanf("%lld",&ac);
        if(ac==1){
            long long x,y,k;
            scanf("%lld%lld%lld",&x,&y,&k);
            add(1,x,y,k);
//              for(int i=0;i<4*n;i++){
//      printf("%d %d %d \n",a[i].l,a[i].r,a[i].h);
//  }
        }else{
            long long x,y;
            scanf("%lld%lld",&x,&y);
            printf("%lld\n",find(1,x,y));
        }
    }
    return 0;
}

by _chicken_ @ 2024-08-07 13:25:57

@ymw123456 没看代码,盲猜long long


by _chicken_ @ 2024-08-07 13:29:01

@ymw123456

#include <bits/stdc++.h>
#define int long long
using namespace std;
struct no{
    int l,r,b,h;
}a[500005];
int b[100005];
void build(int z,int l,int r){
    a[z].l=l;
    a[z].r=r;
    if(l==r){
        a[z].h=b[l];
        return ;
    }else{
        long long mid=l+r>>1;
        build(z*2,l,mid);
        build(z*2+1,mid+1,r);
        a[z].h=a[z*2].h+a[z*2+1].h;
        return ;
    }
}
void dow(int z){
    if(a[z].b!=0){
        a[z*2].b+=a[z].b;
        a[z*2+1].b+=a[z].b;
        long long mid=(a[z].l+a[z].r)/2;
        a[z*2].h+=a[z].b*(mid-a[z*2].l+1);
        a[z*2+1].h+=a[z].b*(a[z*2+1].r-mid);
        a[z].b=0;
    }
    return ;
}
int find(int z,int l,int r){
    if(l<=a[z].l&&a[z].r<=r){
        return a[z].h;
    }
    if(a[z].r<l || a[z].l>r){
        return 0;
    }
    dow(z);
    //long long mid=(a[z].l+a[z].r)/2;
    int s=0;
    if(a[z*2].r>=l){
        s+=find(z*2,l,r);
    }  
    if(a[z*2+1].l<=r){
        s+=find(z*2+1,l,r);
    }  
    return s;
}
int add(int z,int l,int r,int k){
    if(l<=a[z].l&&a[z].r<=r){
        a[z].b+=k;
        a[z].h+=k*(a[z].r-a[z].l+1);
        return 0;
    }
    dow(z);
    long long mid=(a[z].l+a[z].r)/2;
    if(a[z*2].r>=l){
        add(z*2,l,r,k);
    }  
    if(a[z*2+1].l<=r){
        add(z*2+1,l,r,k);
    }
    a[z].h=a[z*2].h+a[z*2+1].h;
    return  0;
}

signed  main(){
//  freopen("a.in","r",stdin);
//  freopen("a.out","w",stdout);
    long long n,m;
    scanf("%lld%lld",&n,&m);
    for(long long i=1;i<=n;i++){
        scanf("%lld",&b[i]);
    }
    build(1,1,n);
//  for(int i=0;i<4*n;i++){
//      printf("%d %d %d \n",a[i].l,a[i].r,a[i].h);
//  }
    for(long long i=1;i<=m;i++){
        long long ac;
        scanf("%lld",&ac);
        if(ac==1){
            long long x,y,k;
            scanf("%lld%lld%lld",&x,&y,&k);
            add(1,x,y,k);
//              for(int i=0;i<4*n;i++){
//      printf("%d %d %d \n",a[i].l,a[i].r,a[i].h);
//  }
        }else{
            long long x,y;
            scanf("%lld%lld",&x,&y);
            printf("%lld\n",find(1,x,y));
        }
    }
    return 0;
}

秒了


by _chicken_ @ 2024-08-07 13:29:48


by _chicken_ @ 2024-08-07 13:32:09

@ymw123456 求关注


by ymw123456 @ 2024-08-07 16:41:26

@chicken 已关,谢谢。


|