有没有大佬能帮帮我
查看原帖
有没有大佬能帮帮我
400201
WuyanruVR楼主2021/3/24 13:19

请问各位大佬有什么优化方法,我T了三个点

#include<stdio.h>
struct xdtr {
	int l,r;
	long long he;
} a[400001];
long long in[400001];
int m,n;
void init(int p,int l,int r) {
	a[p].l=l;
	a[p].r=r;
	if(l==r) {
		a[p].he=in[l];
		return ;
	}
	int mid=(l+r)/2;
	init(p*2,l,mid);
	init(p*2+1,mid+1,r);
	a[p].he=a[p*2].he+a[p*2+1].he;
}
void k1(int p,int l,int r,long long num) {
	if(a[p].l>=l&&a[p].r<=r&&a[p].l==a[p].r) {
		a[p].he+=num;
		return ;
	}
	int mid=(a[p].l+a[p].r)/2;
	if(l<=mid)
		k1(p*2,l,r,num);
	if(r>mid)
		k1(p*2+1,l,r,num);
	a[p].he=a[p*2].he+a[p*2+1].he;
}
long long k2(int p,int l,int r) {
	if(a[p].l>=l&&a[p].r<=r)
		return a[p].he;
	long long ans=0;
	int mid=(a[p].l+a[p].r)/2;
	if(l<=mid)
		ans+=k2(p*2,l,r);
	if(r>mid)
		ans+=k2(p*2+1,l,r);
	return ans;
}
long long read() {
	long long s=0,w=1;
	char ch;
	while((ch=getchar())>'9'||ch<'0')
		if(ch=='-')
			w=-1;
	while(ch>='0'&&ch<='9') {
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
int main() {
	n=read(),m=read();
	for(int i=1; i<=n; i++)
		in[i]=read();
	init(1,1,n);
	for(int i=1; i<=m; i++) {
		int x,y,k;
		k=read(),x=read(),y=read();
		if(k==1) {
			long long num;
			num=read();
			k1(1,x,y,num);
		} else
			printf("%lld\n",k2(1,x,y));
	}
	return 0;
}
2021/3/24 13:19
加载中...