求助本蒟蒻线段树40ptsTLE
查看原帖
求助本蒟蒻线段树40ptsTLE
305904
yezerui11楼主2023/7/18 21:35
#include<bits/stdc++.h>
using namespace std;
struct node{
	long long l,r,tag,sum,mx;
}p[800010];
long long n,m;
long long l,r;
int read(){
	int s=0,f=1;char c=getchar();
	for(;!isdigit(c);c=getchar())
		if(c=='-')f=-1;
	for(;isdigit(c);c=getchar())
		s=s*10+c-'0';
	return s*f;
}
long long siz(long long x){
	return p[x].r-p[x].l+1;
}
void pushup(long long x){
    if(p[x].l==p[x].r){
	    p[x].mx=p[x].sum;
        return;
    }
	p[x].sum=p[2*x].sum+p[2*x+1].sum;
	p[x].mx=max(p[2*x].mx,p[2*x+1].mx);
}
void pushdown(long long x){
    if(p[x].mx<=1){
        return;
    }
	if(p[x].l==p[x].r){
	    while(p[x].tag>0){
	        p[x].tag--;
	        p[x].sum=sqrt(p[x].sum);
	    }
	    p[x].mx=p[x].sum;
	}else{
	    long long tag=p[x].tag;
    	long long lc=2*x,rc=2*x+1;
    	p[lc].tag+=tag;
    	p[rc].tag+=tag;
    	p[x].tag=0;
		if(p[x].mx>1){
		    pushdown(2*x);
	        pushdown(2*x+1);
		}
	    pushup(x);
	}
}
void creat(long long x,long long l,long long r){
	p[x].l=l;
	p[x].r=r;
	if(l==r){
		p[x].sum=read();
		p[x].mx=p[x].sum;
		return;
	}
	long long mid=(l+r)/2;
	creat(2*x,l,mid);
	creat(2*x+1,mid+1,r);
	pushup(x);
}
long long query(long long x){
	if(p[x].l>r||p[x].r<l)return 0;
    pushdown(x);
    pushup(x);
	if(l<=p[x].l&&p[x].r<=r){
		return p[x].sum;
	}
	return query(2*x)+query(2*x+1);
}
void change(long long x){
	if(p[x].l>r||p[x].r<l)return;
	if(p[x].l>=l&&p[x].r<=r){
		p[x].tag++;
		return;
	}
	change(2*x);
	change(2*x+1);
	pushup(x);
}
int main(){
	n=read();
	creat(1,1,n);
	m=read();
	while(m--){
		long long k=read();
		l=read();
		r=read();
		if(l>r){
		    swap(l,r);
		}
		if(k==0){
			change(1);
		}else{
			printf("%lld\n",query(1));
		}
	}
	return 0;
}

评测记录

2023/7/18 21:35
加载中...