[loj6280]数列分块入门 4求助
  • 板块学术版
  • 楼主sid_shi1
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/5/29 11:31
  • 上次更新2023/11/4 22:34:50
查看原帖
[loj6280]数列分块入门 4求助
333126
sid_shi1楼主2021/5/29 11:31

[loj6280]数列分块入门 4,原本是道很水的分块模板题的,提交上去WA 0 分,本地过得去,调了30分钟了,帮忙看看,谢谢了

C++代码:

#include<bits/stdc++.h>
using namespace std;
int n,l[50001]={0},r[50001]={0},pos[50001]={0};
long long a[50001]={0},sum[50001]={0},add[50001]={0};
void build(){
	int t=sqrt(n*1.0),num=n/t;
	if(n%t>0) num++;
	for(int i=1;i<=num;i++){
		l[i]=(i-1)*t+1;
		r[i]=i*t;
	}
	r[num]=n;
	for(int i=1;i<=num;i++){
		for(int j=l[i];j<=r[i];j++){
			pos[j]=i;
			sum[i]+=a[j];
		}
	}
}
void change(int x,int y,long long z){
	int p=pos[x],q=pos[y];
	if(p==q){
		for(int i=x;i<=y;i++) a[i]+=z;
		sum[p]+=z*(y-x+1);
	}else{
		for(int i=p+1;i<=q-1;i++) add[i]+=z;
		for(int i=x;i<=r[p];i++) a[i]+=z;
		sum[p]+=z*(r[p]-x+1);
		for(int i=l[q];i<=y;i++) a[i]+=z;
		sum[q]+=z*(y-l[q]+1);
	}
}
long long query(int x,int y){
	int p=pos[x],q=pos[y];
	long long ans=0;
	if(p==q){
		for(int i=x;i<=y;i++) ans+=a[i];
		ans+=add[p]*(y-x+1);
	}else{
		for(int i=p+1;i<=q-1;i++) ans+=sum[i]+add[i]*(r[i]-l[i]+1);
		for(int i=x;i<=r[p];i++) ans+=a[i];
		ans+=add[p]*(r[p]-x+1);
		for(int i=l[q];i<=y;i++) ans+=a[i];
		ans+=add[q]*(y-r[q]+1);
	}
	return ans;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    build(); 
    for(int i=1;i<=n;i++){
    	int x,y,z,k;
        scanf("%d%d%d%d",&x,&y,&z,&k);
        if(x==0) change(y,z,k);
        else printf("%lld\n",query(y,z)%(k+1));
    }
    return 0;
}
2021/5/29 11:31
加载中...