数列分块入门4求调
  • 板块学术版
  • 楼主Deerfall0625
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/7/19 15:50
  • 上次更新2023/11/3 08:52:23
查看原帖
数列分块入门4求调
679128
Deerfall0625楼主2023/7/19 15:50

题目这里

代码:

#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN = 5e4 + 10;
int a[MAXN],L[MAXN],R[MAXN],tag[MAXN],belong[MAXN];
int n,block,num;
void build(){
	block=sqrt(n);
	num=n/block;
	if(n%block) num++;
	for(int i=1;i<=num;i++){
		L[i]=(i-1)*block+1;
		R[i]=i*block;
	}
	R[num]=n;
	for(int i=1;i<=n;i++){
		belong[i]=(i-1)/block+1;
	}
}
void add(int l,int r,int x){
	if(belong[l]==belong[r]){
		for(int i=l;i<=r;i++){
			a[i]+=x;
		}
	}
	else{
		for(int i=l;i<=R[belong[l]];i++){
			a[i]+=x;
		}
		for(int i=belong[l]+1;i<belong[r];i++){
			tag[i]+=x;
		}
		for(int i=L[belong[r]];i<=r;i++){
			a[i]+=x;
		}
	}
}
int query(int l,int r,int mod){
	int ans=0;
	if(belong[l]==belong[r]){
		for(int i=l;i<=r;i++){
			ans+=a[i]+tag[belong[l]];
			ans%=mod;
		}
	}
	else{
		for(int i=l;i<=R[belong[l]];i++){
			ans+=a[i]+tag[belong[l]];
			ans%=mod;
		}
		for(int i=belong[l]+1;i<belong[r];i++){
			ans+=tag[i]*block;
			ans%=mod;
		}
		for(int i=L[belong[r]];i<=r;i++){
			ans+=a[i]+tag[belong[r]];
			ans%=mod;
		}
	}
	return ans%mod;
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	build();
	for(int i=1;i<=n;i++){
		int opt,l,r,c;
		scanf("%lld%lld%lld%lld",&opt,&l,&r,&c);
		if(opt==0){
			add(l,r,c);
		}
		else{
			printf("%lld\n",query(l,r,c+1));
		}
	}
} 
2023/7/19 15:50
加载中...