大佬们,最近在学分块数组,感谢帮我看看
查看原帖
大佬们,最近在学分块数组,感谢帮我看看
742305
du1wu2debenben楼主2022/9/6 17:37

#谢谢各位了!!

cpp
#include <iostream>
#include <math.h>
#define ll long long
using namespace std;

int main() {
    ll n,m;   //分别表示该数列数字的个数和操作的总个数。
    cin>>n>>m;
    ll a[10005]={0};
    ll sta[1005]={0};
    ll end[1005]={0};
    ll belong[10005]={0};
    ll num=sqrt(n);
    for (ll i=1; i<=n; i++) {
        cin>>a[i];
    }
    //标记起点和终点
    for (ll i=1; i<=num; i++) {
        sta[i]=n/num*(i-1)+1;
        end[i]=n/num*i;
    }
    end[num]=n;
    //设计belong数组
    for (ll i=1; i<=num; i++) {
        for (ll j=sta[i]; j<=end[i]; j++) {
            belong[j]=i;
        }
    }
    //设计size数组
    ll size[1005]={0};
    for (ll i=1; i<=num; i++) {
        ll step=end[i]-sta[i]+1;
        size[i]=step;
    }
    //设计sum数组
    ll Sum[1005]={0};
    for (ll i=1; i<=num; i++) {
        ll s=0;
        for (ll j=sta[i]; j<=end[i]; j++) {
            s+=a[j];
        }
        Sum[i]=s;
    }
    //下面是操作
    for (int i=1; i<=m; i++) {
        int t;
        cin>>t;
        if(t==1){
            ll L,R,W;
            cin>>L>>R>>W;       //这里有一个层次的问题,L,R都是表层
            ll x=belong[L];
            ll y=belong[R];
            if(x==y){
                for (ll j=L; j<=R; j++) {
                    a[j]+=W;
                }
                size[x]+=W*(R-L+1);
            }
            else{
                //1 修改L对应的那个数组
                for (ll j=L; j<=end[belong[L]]; j++) {
                    a[j]+=W;
                }
                Sum[belong[L]]+=W*(end[belong[L]]-L+1);
                //2 修改R对应的那个数组
                for (ll j=R; j>=sta[belong[R]]; j--) {
                    a[j]+=W;
                }
                Sum[belong[R]]+=W*(R-sta[belong[L]]+1);
                //3 修改中间的对应区块
                for (ll j=belong[L]+1; j<belong[R]; j++) {
                    for (ll p=sta[j]; p<=end[j]; p++) {
                        a[p]+=W;
                    }
                    Sum[j]+=size[j]*W;
                }
            }
        }
        else{
            ll L,R;
            cin>>L>>R;
            ll x=belong[L];
            ll y=belong[R];
            if(x==y){
                ll sum=0;
                for (ll j=L; j<=R; j++) {
                    sum+=a[j];
                }
                cout<<sum<<endl;
            }
            else{
                ll sum=0;
                for (ll j=L; j<=end[belong[L]]; j++) {
                    sum+=a[j];
                }
                for (ll j=R; j>=sta[belong[R]]; j--) {
                    sum+=a[j];
                }
                for (ll j=belong[L]+1; j<belong[R]; j++) {
                    sum+=Sum[j];
                }
                cout<<sum<<endl;
            }
        }
    }
    return 0;
}
2022/9/6 17:37
加载中...