求助
查看原帖
求助
543206
shiroko2008楼主2022/2/10 17:32

7MLE,3RE

#include<algorithm>
using namespace std;
const int N=1000000;
int v[4*N],a[N],d[4*N];
void build(int x,int l,int r)
{
	if (l==r) {
		v[x]=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(x*2,l,mid);
	build(x*2+1,mid+1,r);
	v[x]=v[x*2]+v[x*2+1];
}
int point_query(int x,int l,int r,int y) 
{
	if (l==r) return v[x];
	int mid=(l+r)/2;
	if (y<=mid) return point_query(x*2,l,mid,y);
	else return point_query(x*2+1,mid+1,r,y);
}
int line_query(int x,int l,int r,int ql,int qr)
{
	if (l==ql&&r==qr) return v[x];
	int mid=(l+r)/2;
	if (ql<=mid&&qr>mid) return line_query(x*2,l,mid,ql,mid)+line_query(x*2+1,mid+1,r,mid+1,qr);
	else if (qr<=mid) return line_query(x*2,l,mid,ql,qr);
	else return line_query(x*2+1,mid+1,r,ql,qr);
}
void push_down(int x,int l,int r,int mid)
{
	if (d[x]==0) return ;
	d[x*2]+=d[x];
	v[x*2]+=d[x]*(mid-l+1);
	d[x*2+1]+=d[x];
	v[x*2+1]+=d[x]*r-mid;
	d[x]=0;
}
void add_modify(int x,int l,int r,int ql,int qr,int z)
{
	if (l==ql&&r==qr) {
		v[x]+=z*(r-l+1);
		d[x]+=z;
		return ;
	}
	int mid=(l+r)/2;
	push_down(x,l,r,mid);
	if (ql<=mid&&qr>mid) {
		add_modify(x*2,l,mid,ql,mid,z);
		add_modify(x*2+1,mid+1,r,mid+1,qr,z);
	}
	else if (qr<=mid) add_modify(x*2,l,mid,ql,qr,z);
	else add_modify(x*2+1,mid+1,r,ql,qr,z);
	v[x]=v[x*2]+v[x*2+1];
}
int main()
{
	int n,m;
	cin>>n>>m;
	for (int i=1;i<=n;i++) cin>>a[i];
	int x,y,z,k;
	build(1,1,n);
	for (int i=0;i<m;i++) {
		cin>>x;
		if (x==1) {
			cin>>y,z,k;
			add_modify(1,y,z,1,n,k);
		}
		else {
			cin>>y,z;
			cout<<line_query(1,y,z,1,n)<<endl;
		}
	}
	return 0;
}
2022/2/10 17:32
加载中...