Portal:#6227 数列分块入门1
Code:
#include<bits/stdc++.h>
using namespace std;
inline int Read(){
int dx=0,fh=1;
char c=getchar();
while(c>'9'||c<'0'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
dx=dx*10+c-'0';
c=getchar();
}
return fh*dx;
}
int n,a[50005],sum[1001],addtag[1001];
int belon(int x){
return x/((int)sqrt(n));
}
int main(){
n=Read();
for(int i=1;i<=n;++i){
a[i]=Read();
sum[belon(i)]+=a[i];
}
for(int i=1;i<=n;++i){
int opt=Read(),l=Read(),r=Read(),c=Read();
if(!opt){
if(belon(r)-belon(l)<=1)
for(int j=l;j<=r;++j)
a[j]+=c;
else{
for(int j=l;belon(j)==belon(l);++j)
a[j]+=c;
for(int j=belon(l)+1;j<belon(r);++j)
addtag[j]+=c;
for(int j=r;belon(j)==belon(r);--j)
a[j]+=c;
}
}
else
printf("%d\n",a[r]+addtag[belon(r)]);
}
return 0;
}
反思与总结:
分块可以不用数组来存储每个点属于的块,可以用一个函数来节约时间