ymw123456 @ 2024-08-07 13:20:51
线段树写法,后三个数据WA了测评记录
代码
#include <bits/stdc++.h>
using namespace std;
struct no{
int l,r,b,h;
}a[500005];
int b[100005];
void build(int z,int l,int r){
a[z].l=l;
a[z].r=r;
if(l==r){
a[z].h=b[l];
return ;
}else{
long long mid=l+r>>1;
build(z*2,l,mid);
build(z*2+1,mid+1,r);
a[z].h=a[z*2].h+a[z*2+1].h;
return ;
}
}
void dow(int z){
if(a[z].b!=0){
a[z*2].b+=a[z].b;
a[z*2+1].b+=a[z].b;
long long mid=(a[z].l+a[z].r)/2;
a[z*2].h+=a[z].b*(mid-a[z*2].l+1);
a[z*2+1].h+=a[z].b*(a[z*2+1].r-mid);
a[z].b=0;
}
return ;
}
int find(int z,int l,int r){
if(l<=a[z].l&&a[z].r<=r){
return a[z].h;
}
if(a[z].r<l || a[z].l>r){
return 0;
}
dow(z);
//long long mid=(a[z].l+a[z].r)/2;
int s=0;
if(a[z*2].r>=l){
s+=find(z*2,l,r);
}
if(a[z*2+1].l<=r){
s+=find(z*2+1,l,r);
}
return s;
}
int add(int z,int l,int r,int k){
if(l<=a[z].l&&a[z].r<=r){
a[z].b+=k;
a[z].h+=k*(a[z].r-a[z].l+1);
return 0;
}
dow(z);
long long mid=(a[z].l+a[z].r)/2;
if(a[z*2].r>=l){
add(z*2,l,r,k);
}
if(a[z*2+1].l<=r){
add(z*2+1,l,r,k);
}
a[z].h=a[z*2].h+a[z*2+1].h;
return 0;
}
int main(){
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
long long n,m;
scanf("%lld%lld",&n,&m);
for(long long i=1;i<=n;i++){
scanf("%lld",&b[i]);
}
build(1,1,n);
// for(int i=0;i<4*n;i++){
// printf("%d %d %d \n",a[i].l,a[i].r,a[i].h);
// }
for(long long i=1;i<=m;i++){
long long ac;
scanf("%lld",&ac);
if(ac==1){
long long x,y,k;
scanf("%lld%lld%lld",&x,&y,&k);
add(1,x,y,k);
// for(int i=0;i<4*n;i++){
// printf("%d %d %d \n",a[i].l,a[i].r,a[i].h);
// }
}else{
long long x,y;
scanf("%lld%lld",&x,&y);
printf("%lld\n",find(1,x,y));
}
}
return 0;
}
by _chicken_ @ 2024-08-07 13:25:57
@ymw123456 没看代码,盲猜long long
by _chicken_ @ 2024-08-07 13:29:01
@ymw123456
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct no{
int l,r,b,h;
}a[500005];
int b[100005];
void build(int z,int l,int r){
a[z].l=l;
a[z].r=r;
if(l==r){
a[z].h=b[l];
return ;
}else{
long long mid=l+r>>1;
build(z*2,l,mid);
build(z*2+1,mid+1,r);
a[z].h=a[z*2].h+a[z*2+1].h;
return ;
}
}
void dow(int z){
if(a[z].b!=0){
a[z*2].b+=a[z].b;
a[z*2+1].b+=a[z].b;
long long mid=(a[z].l+a[z].r)/2;
a[z*2].h+=a[z].b*(mid-a[z*2].l+1);
a[z*2+1].h+=a[z].b*(a[z*2+1].r-mid);
a[z].b=0;
}
return ;
}
int find(int z,int l,int r){
if(l<=a[z].l&&a[z].r<=r){
return a[z].h;
}
if(a[z].r<l || a[z].l>r){
return 0;
}
dow(z);
//long long mid=(a[z].l+a[z].r)/2;
int s=0;
if(a[z*2].r>=l){
s+=find(z*2,l,r);
}
if(a[z*2+1].l<=r){
s+=find(z*2+1,l,r);
}
return s;
}
int add(int z,int l,int r,int k){
if(l<=a[z].l&&a[z].r<=r){
a[z].b+=k;
a[z].h+=k*(a[z].r-a[z].l+1);
return 0;
}
dow(z);
long long mid=(a[z].l+a[z].r)/2;
if(a[z*2].r>=l){
add(z*2,l,r,k);
}
if(a[z*2+1].l<=r){
add(z*2+1,l,r,k);
}
a[z].h=a[z*2].h+a[z*2+1].h;
return 0;
}
signed main(){
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
long long n,m;
scanf("%lld%lld",&n,&m);
for(long long i=1;i<=n;i++){
scanf("%lld",&b[i]);
}
build(1,1,n);
// for(int i=0;i<4*n;i++){
// printf("%d %d %d \n",a[i].l,a[i].r,a[i].h);
// }
for(long long i=1;i<=m;i++){
long long ac;
scanf("%lld",&ac);
if(ac==1){
long long x,y,k;
scanf("%lld%lld%lld",&x,&y,&k);
add(1,x,y,k);
// for(int i=0;i<4*n;i++){
// printf("%d %d %d \n",a[i].l,a[i].r,a[i].h);
// }
}else{
long long x,y;
scanf("%lld%lld",&x,&y);
printf("%lld\n",find(1,x,y));
}
}
return 0;
}
秒了
by _chicken_ @ 2024-08-07 13:29:48
by _chicken_ @ 2024-08-07 13:32:09
@ymw123456 求关注
by ymw123456 @ 2024-08-07 16:41:26
@chicken 已关,谢谢。