题解:分块。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=50005;
int w[maxn],sum[maxn],block;
int main()
{
int k,i,n,l,r,c,op,pre,end;
scanf("%d",&n);
block=sqrt(n);
for(i=1;i<=n;i++) scanf("%d",&w[i]);
for(i=0;i<n;i++)
{
scanf("%d%d%d%d",&op,&l,&r,&c);
if(op==0)
{
pre=((l-1)/block+1);
end=((r-1)/block+1);
if(pre==end) for(k=l;k<=r;k++) w[k]+=c;
else
{
for(k=l;k<=min(pre*block,n);k++) w[k]+=c;
for(k=(end-1)*block+1;k<=r;k++) w[k]+=c;
for(k=pre+1;k<end;k++) sum[k]+=c;
}
}
else printf("%d
",w[r]+sum[((r-1)/block+1)]);
}
system("pause");
return 0;
}
题解:分块。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
int n,block;
long long sum[maxn],b[maxn],w[maxn];
int get(int x);
void update(int l,int r,int c);
long long check(int l,int r,int c);
int main()
{
int i,op,l,r,c;
scanf("%d",&n);
block=sqrt(n);
for(i=1;i<=n;i++)
{
scanf("%lld",&w[i]);
sum[get(i)]+=w[i];
}
for(i=0;i<n;i++)
{
scanf("%d%d%d%d",&op,&l,&r,&c);
if(op==0) update(l,r,c);
else printf("%lld
",check(l,r,c));
}
system("pause");
return 0;
}
int get(int x)
{return (x-1)/block+1;}
void update(int l,int r,int c)
{
int pre,end,k;
pre=get(l);end=get(r);
if(pre==end)
{
for(k=l;k<=r;k++)
w[k]+=c,sum[get(k)]+=c;
}
else
{
for(k=l;k<=min(pre*block,n);k++) w[k]+=c,sum[get(k)]+=c;
for(k=(end-1)*block+1;k<=r;k++) w[k]+=c,sum[get(k)]+=c;
for(k=pre+1;k<end;k++) b[k]+=c;
}
}
long long check(int l,int r,int c)
{
long long ans=0;
int pre,end,k,x;
pre=get(l);end=get(r);
if(pre==end)
{
for(k=l;k<=r;k++)
ans=(ans+w[k]+b[pre])%(c+1);
}
else
{
for(k=l;k<=min(pre*block,n);k++) ans=(ans+w[k]+b[get(k)])%(c+1);
for(k=(end-1)*block+1;k<=r;k++) ans=(ans+w[k]+b[get(k)])%(c+1);
for(k=pre+1;k<end;k++) ans=(ans+sum[k]+b[k]*block)%(c+1);
}
return ans%(c+1);
}