七月二十三日
H - 数列分块入门 1 LibreOJ - 6277
题目在这里
这是一次TLE的代码,原因在于中间块的代码更新问题
#include<bits/stdc++.h>
#define max 50005
using namespace std;
int a[max],bel[max];
int main() {
int n;
scanf("%d",&n);
int m=sqrt(n);
int op,l,r,c;
for(int i=1; i<=n; i++) {
scanf("%d",&a[i]);
bel[i] = (i-1)/m+1;
}
for(int i=1; i<=n; i++) {
scanf("%d %d %d %d",&op,&l,&r,&c);
if(op)
printf("%d\n",a[r]);
else {
if(bel[l]!=bel[r]) {
for(int i=l; i<=bel[l]* m; i++ )
a[i]+=c;
for(int i=(bel[r]-1)*m+1; i<=r; i++)
a[i]+=c;
for(int i=bel[l]*m+1; i<=(bel[r]-1)*m; i++)
a[i]+=c;
}
else {
for(int i=l; i<=r; i++) {
a[i]+=c;
}
}
}
}
}
这是AC版
#include<bits/stdc++.h>
#define max 50005
using namespace std;
int a[max],bel[max],block[max];
int main() {
int n;
scanf("%d",&n);
int m=sqrt(n);
int op,l,r,c;
for(int i=1; i<=n; i++) {
scanf("%d",&a[i]);
bel[i] = (i-1)/m+1;
}
for(int i=1; i<=n; i++) {
scanf("%d%d%d%d",&op,&l,&r,&c);
if(op)
printf("%d\n",block[bel[r]]+a[r]);
else {
if(bel[l]!=bel[r]) {
for(int i=l; i<=bel[l]*m; i++ )
a[i]+=c;
for(int i=(bel[r]-1)*m+1; i<=r; i++)
a[i]+=c;
for(int i=bel[l]+1; i<=bel[r]-1; i++) {
block[i]+=c;
}
} else {
for(int i=l; i<=r; i++) {
a[i]+=c;
}
}
}
}
}