ycy1124 @ 2024-06-24 10:25:05
#include<bits/stdc++.h>
using namespace std;
struct Node{
long long l,r,bj,w;
}a[2000001];
long long b[500001];
void work(int p,int l,int r){
int mid=(l+r)>>1;
a[p].l=l;
a[p].r=r;
if(l==r){
a[p].w=b[l];
return;
}
work(p*2,l,mid);
work(p*2+1,mid+1,r);
a[p].w=a[p*2].w+a[p*2+1].w;
}
int ans(int p,int l,int r,int x,int y){
int mid=(l+r)>>1;
a[p].w+=(r-l+1)*a[p].bj;
a[p*2].bj=a[p].bj;
a[p*2+1].bj=a[p].bj;
a[p].bj=0;
if(l>=x&&r<=y){
return a[p].w;
}
if(y<=mid){
return ans(p*2,l,mid,x,y);
}
else if(x>mid){
return ans(p*2+1,mid+1,r,x,y);
}
else{
return ans(p*2,l,mid,x,y)+ans(p*2+1,mid+1,r,x,y);
}
}
void work1(int p,int l,int r,int x,int y,int k){
int mid=(l+r)>>1;
if(x<=l&&y>=r){
a[p].bj+=k;
return;
}
a[p].w+=(min(y,r)-max(x,l)+1)*k;
if(x>mid){
work1(p*2+1,mid+1,r,x,y,k);
}
else if(y<=mid){
work1(p*2,l,mid,x,y,k);
}
else{
work1(p*2,l,mid,x,y,k);
work1(p*2+1,mid+1,r,x,y,k);
}
}
void read(long long &x){
x=0;
int 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();}
x*=f;
}
int main(){
long long n,m;
read(n);
read(m);
for(int i=1;i<=n;i++){
read(b[i]);
}
work(1,1,n);
for(int i=1;i<=m;i++){
long long ch,x,y,k;
read(ch);
if(ch==1){
read(x);
read(y);
read(k);
work1(1,1,n,x,y,k);
}
else{
read(x);
read(y);
printf("%lld\n",ans(1,1,n,x,y));
}
}
return 0;
}
by ycy1124 @ 2024-06-24 10:32:31
#include<bits/stdc++.h>
using namespace std;
struct Node{
long long int l,r,bj,w;
}a[2000001];
long long int b[500001];
void work(int p,int l,int r){
int mid=(l+r)>>1;
a[p].l=l;
a[p].r=r;
if(l==r){
a[p].w=b[l];
return;
}
work(p*2,l,mid);
work(p*2+1,mid+1,r);
a[p].w=a[p*2].w+a[p*2+1].w;
}
int ans(int p,int l,int r,int x,int y){
int mid=(l+r)>>1;
a[p].w+=(r-l+1)*a[p].bj;
a[p*2].bj+=a[p].bj;
a[p*2+1].bj+=a[p].bj;
a[p].bj=0;
if(l>=x&&r<=y){
return a[p].w;
}
if(y<=mid){
return ans(p*2,l,mid,x,y);
}
else if(x>mid){
return ans(p*2+1,mid+1,r,x,y);
}
else{
return ans(p*2,l,mid,x,y)+ans(p*2+1,mid+1,r,x,y);
}
}
void work1(int p,int l,int r,int x,int y,int k){
int mid=(l+r)>>1;
if(x<=l&&y>=r){
a[p].bj+=k;
return;
}
a[p].w+=(min(y,r)-max(x,l)+1)*k;
if(x>mid){
work1(p*2+1,mid+1,r,x,y,k);
}
else if(y<=mid){
work1(p*2,l,mid,x,y,k);
}
else{
work1(p*2,l,mid,x,y,k);
work1(p*2+1,mid+1,r,x,y,k);
}
}
void read(long long &x){
x=0;
int 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();}
x*=f;
}
int main(){
long long int n,m;
read(n);
read(m);
for(int i=1;i<=n;i++){
read(b[i]);
}
work(1,1,n);
for(int i=1;i<=m;i++){
long long int ch,x,y,k;
read(ch);
if(ch==1){
read(x);
read(y);
read(k);
work1(1,1,n,x,y,k);
}
else{
read(x);
read(y);
printf("%lld\n",ans(1,1,n,x,y));
}
}
return 0;
}
70pts
by CbrX @ 2024-06-24 10:44:02
ans函数怎么用int返回值
by O_v_O @ 2024-06-24 10:48:11
你的函数 ans 的返回值应该时 long long,不然会爆。
代码:
#include<bits/stdc++.h>
using namespace std;
struct Node{
long long int l,r,bj,w;
}a[2000001];
long long int b[500001];
void work(int p,int l,int r){
int mid=(l+r)>>1;
a[p].l=l;
a[p].r=r;
if(l==r){
a[p].w=b[l];
return;
}
work(p*2,l,mid);
work(p*2+1,mid+1,r);
a[p].w=a[p*2].w+a[p*2+1].w;
}
long long ans(int p,int l,int r,int x,int y){
int mid=(l+r)>>1;
a[p].w+=(r-l+1)*a[p].bj;
a[p*2].bj+=a[p].bj;
a[p*2+1].bj+=a[p].bj;
a[p].bj=0;
if(l>=x&&r<=y){
return a[p].w;
}
if(y<=mid){
return ans(p*2,l,mid,x,y);
}
else if(x>mid){
return ans(p*2+1,mid+1,r,x,y);
}
else{
return ans(p*2,l,mid,x,y)+ans(p*2+1,mid+1,r,x,y);
}
}
void work1(int p,int l,int r,int x,int y,int k){
int mid=(l+r)>>1;
if(x<=l&&y>=r){
a[p].bj+=k;
return;
}
a[p].w+=(min(y,r)-max(x,l)+1)*k;
if(x>mid){
work1(p*2+1,mid+1,r,x,y,k);
}
else if(y<=mid){
work1(p*2,l,mid,x,y,k);
}
else{
work1(p*2,l,mid,x,y,k);
work1(p*2+1,mid+1,r,x,y,k);
}
}
void read(long long &x){
x=0;
int 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();}
x*=f;
}
int main(){
long long int n,m;
read(n);
read(m);
for(int i=1;i<=n;i++){
read(b[i]);
}
work(1,1,n);
for(int i=1;i<=m;i++){
long long int ch,x,y,k;
read(ch);
if(ch==1){
read(x);
read(y);
read(k);
work1(1,1,n,x,y,k);
}
else{
read(x);
read(y);
printf("%lld\n",ans(1,1,n,x,y));
}
}
return 0;
}
by ycy1124 @ 2024-06-24 10:51:13
@CbrX @woshishadanda 哦,谢谢两位大佬,本人眼瞎,已关