样例没过求调
查看原帖
样例没过求调
1068165
InfiniteRobin楼主2024/7/19 17:29
#include<bits/stdc++.h>
using namespace std;

const int N=2e5+3;
long long c[N],num[N],tag[N],mu[N];
//c表示第i个墓岁哦在的块
//num表示一整个块的和
//tag表示该块懒标记的总值
//mu表示单个墓的风水 
struct node{
    int l,r;
}a[N];//块的范围 

int n,f;

void init(){  //初始化 
    int k=sqrt(n);
    
    for(int i=1;i<=n;i++){
        a[i].l=a[i-1].r+1;
        a[i].r=a[i-1].l+k;
    }
    
    if(a[k].r<n){
        k++;
        a[k].l=a[k-1].r+1;
        a[k].r=n;
    }
    
    for(int i=1;i<=k;i++){
        for(int j=a[i].l;j<=a[i].r;j++){
            c[j]=i;
        }
    }
    return;
}

void change(int kuai,int l,int r,int x){
    for(int i=l;i<=r;i++){
        num[kuai]+=x;
        mu[i]+=x;
    }
}

long long search(int kuai,int l,int r){
    long long ans=0;
    for(int i=l;i<=r;i++){
        ans+=mu[i]+tag[i];
    }
    return ans;
}

void modify(int l,int r,int x){
    if(c[l]==c[r]){
        change(c[l],l,r,x);
        return;
    }
    change(c[l],l,a[c[l]].r,x);
    change(c[r],a[c[r]].l,r,x);
    for(int i=c[l]+1;i<=c[r]-1;i++){
        num[i]+=(a[i].r-a[i].l+1)*x;
        tag[i]+=x;
    }
}

long long query(int l,int r){
    long long ans=0;
    if(c[l]==c[r]){
        ans+=search(c[l],l,r);
        return ans;
    }
    ans+=search(c[l],l,a[c[l]].r);
    ans+=search(c[r],a[c[r]].l,r);
    for(int i=c[l]+1;i<=c[r]-1;i++){
       ans+=num[i];
    }
    return ans;
}

int main(){
	
	
    cin>>n>>f;
    
    init();
   
    for(int i=1;i<=n;i++){
        cin>>mu[i];
        num[c[i]]+=mu[i];
    }
    
    int op,k,l,r;
    while(f--){
        cin>>op;
        if(op==1){
            cin>>l>>r>>k;
            modify(l,r,k);
        }
        else if(op==2){
            cin>>k;
            modify(1,1,k);
        }
        else if(op==3){
            cin>>k;
            modify(1,1,-k);
        }
        else if(op==4){
            cin>>l>>r;
            cout<<query(l,r)<<"\n";
        }
        else{
            cout<<query(1,1)<<"\n";
        }
    }
    return 0;
}
2024/7/19 17:29
加载中...