MX刚学oi一秒,求助分块

P3372 【模板】线段树 1

```cpp #include<cstdio> #include<iostream> #include<cmath> using namespace std; long long n,m; const long long M = 100005; long long dx[M]; long long l[M],r[M]; long long a[M]; long long belong[M]; long long lazy[M]; long long bg,sum; inline long long read() { long long x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();} return x*f; } void buildd(){ bg=sqrt(n); sum=n/bg; if(n%bg) sum++; for(int i=1;i<=sum;i++) l[i]=(i-1)*bg+1,r[i]=i*bg; r[sum]=n; for(int i=1;i<=n;i++) belong[i]=(i-1)/bg+1; for(int i=1;i<=sum;i++) for(int j=l[i];j<=r[i];j++) dx[i]+=a[j]; return; } inline void updata(long long x,long long y,long long k){ if(belong[x]==belong[y]){ for(int i=x;i<=y;i++) a[i]+=k; dx[belong[x]]+=(y-x+1)*k; } else{ { for(int i=x;i<=r[belong[x]];i++) a[i]+=k; dx[belong[x]]+=(r[belong[x]]-x+1)*k; } for(int i=belong[x]+1;i<=belong[y]-1;i++) lazy[i]+=k,dx[i]+=(r[i]-l[i]+1)*k; { for(int i=l[belong[y]];i<=y;i++) a[i]+=k; dx[belong[y]]+=(y-l[belong[y]]+1)*k; } } return; } long long query(long long x,long long y){ long long ans=0; if(belong[x]==belong[y]){ for(int i=x;i<=y;i++) ans+=a[i]; } else{ for(int i=x;i<=r[belong[x]];i++) ans+=a[i]; for(int i=belong[x]+1;i<=belong[y]-1;i++){ ans+=dx[i]; } for(int i=l[belong[y]];i<=y;i++) ans+=a[i]; ans+=lazy[belong[x]]*(r[belong[x]]-x+1); ans+=lazy[belong[y]]*(y-l[belong[y]]+1); } return ans; } int main(){ //freopen("P3372_8.in","r",stdin); //freopen("P3372_8.out","w",stdout); n=read(),m=read(); for(int i=1;i<=n;i++) a[i]=read(); buildd(); long long qqq; for(int i=1;i<=m;i++){ qqq=read(); if(qqq==1){ long long x,y,k; x=read(),y=read(),k=read(); updata(x,y,k); } if(qqq==2){ long long wh,jjj; wh=read(),jjj=read(); printf("%lld\n",query(wh,jjj)); } } return 0; } ``` 帮你魔改了一下 @[Chase_future](/user/241817)
by peterwuyihong @ 2021-09-21 14:40:50


@[peterwuyihong](/user/100325) 谢神仙啦,我自己看看
by Chancylaser @ 2021-09-21 14:48:38


|