线段树优化求助
  • 板块学术版
  • 楼主dshzsh
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/8/15 11:02
  • 上次更新2023/11/6 20:14:41
查看原帖
线段树优化求助
200116
dshzsh楼主2020/8/15 11:02
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int qj[maxn];
struct xds{
	int left;
	int right;
	int ans;
	int lazy;
};
xds tr[4*maxn];
void build(int le,int ri,int x)
{
	tr[x].lazy=0;
	tr[x].left=le;
	tr[x].right=ri;
	if(le==ri)
	{
		tr[x].ans=qj[le];
		return;
	}
	int mid=(le+ri)>>1;
	build(le,mid,x<<1);
	build(mid+1,ri,x<<1|1);
	tr[x].ans=tr[x<<1].ans+tr[x<<1|1].ans;
	return;
}
inline void push(int rt)
{
	int k=tr[rt].lazy;tr[rt].lazy=0;
	int le=rt<<1,ri=rt<<1|1;
	tr[le].lazy+=k,tr[ri].lazy+=k;
	tr[le].ans+=k*(tr[le].right-tr[le].left+1);
	tr[ri].ans+=k*(tr[ri].right-tr[ri].left+1);
}
void xg(int x,int y,int k,int rt)
{
	if(x>y) return;
	if(x<=tr[rt].left&&tr[rt].right<=y)
	{
		tr[rt].lazy+=k;
		tr[rt].ans+=k*(tr[rt].right-tr[rt].left+1);
		return;
	}
	push(rt);
	int mid=(tr[rt].left+tr[rt].right)>>1;
	if(x<=mid)
		xg(x,y,k,rt<<1);
	if(y>mid)
		xg(x,y,k,rt<<1|1);
	tr[rt].ans=tr[rt<<1].ans+tr[rt<<1|1].ans;
	return;
}
int js(int x,int y,int rt)
{
	int ans=0;
	if(x>y) return 0;
	if(x<=tr[rt].left&&tr[rt].right<=y)
	{
		return tr[rt].ans;
	}
	push(rt);
	int mid=(tr[rt].left+tr[rt].right)>>1;
	if(x<=mid)
		ans+=js(x,y,rt<<1);
	if(y>mid)
		ans+=js(x,y,rt<<1|1);
	return ans;
}
signed main()
{
	int n,m;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&qj[i]);
	}
	build(1,n,1);
	scanf("%d",&m);
	for(int ii=1;ii<=m;ii++)
	{
		char cz;
		cin>>cz;
		if(cz=='C')
		{
			int x,y,k;
			scanf("%d%d%d",&x,&y,&k);
			xg(x,y,k,1);
		}
		else if(cz=='Q')
		{
			int x,y;
			scanf("%d%d",&x,&y);
			printf("%d\n",js(x,y,1));
		}
	}
	return 0;
}

洛谷上能AC,但是效率不高,在另一个oj上超时了(答案正确),求优化

2020/8/15 11:02
加载中...