这个线段树有问题吗?TLE求助
  • 板块学术版
  • 楼主P_BisectorGo ahead
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/4/13 11:24
  • 上次更新2024/4/13 13:42:44
查看原帖
这个线段树有问题吗?TLE求助
914391
P_BisectorGo ahead楼主2024/4/13 11:24

rt。

#include<iostream>
#include<map>
using namespace std;
#define int long long
int s[800005],add[800005];
void read(int &x){
	int f;char c;
	for (f=1,c=getchar();c<'0'||c>'9';c=getchar()) if(c=='-') f=-1;
	for(x=0;c<='9'&&c>='0';c=getchar()) x=x*10+(c&15);x*=f;
} 
void build(int p,int l,int r){
    if(l==r){
		read(s[p]);
		return ;
	}
    int mid=(l+r)/2;
    build(p*2,l,mid);build(p*2+1,mid+1,r);
    s[p]=s[p*2]+s[p*2+1];
} 
void push_down(int p,int l,int r){
	if(l==r)return;
	int m=(l+r)/2;
	add[p*2]+=add[p];
	add[p*2+1]+=add[p];
	s[p*2]+=add[p]*(m-l+1);
	s[p*2+1]+=add[p]*(r-m);
	add[p]=0;
} 
void change(int p,int l,int r,int x,int y,int v){
	if(l>y&&r<x||l>r)return;
	if(l>=x&&r<=y){
		s[p]+=(r-l+1)*v;
		add[p]+=v;
		return;
	}
	if(l==r)return;
	int m=(l+r)/2;
	push_down(p,l,r);
	change(p*2,l,m,x,y,v);
	change(p*2+1,m+1,r,x,y,v);
	s[p]=s[p*2]+s[p*2+1];
}
int getsum(int p,int l,int r,int x,int y){
	if(l>y||r<x)return 0;
	if(l>=x&&r<=y)return s[p];
	int m=(l+r)/2;
	push_down(p,l,r);
	return getsum(p*2,l,m,x,y)+getsum(p*2+1,m+1,r,x,y);
}
int n,N;
signed main(){
    cin>>n>>N;
    build(1,1,n);
    while(N--){
        int op;read(op);
        if(op==1){
            int l,r,v;
            read(l),read(r),read(v);
            change(1,1,n,l,r,v);
        }
        if(op==2){
            int l,r;
            read(l),read(r);
            printf("%lld\n",getsum(1,1,n,l,r));
        }
    }
}```
2024/4/13 11:24
加载中...