线段树后三个点TLE
查看原帖
线段树后三个点TLE
742030
hyh0926楼主2024/10/6 21:43

rt

#include<bits/stdc++.h>
using namespace std;
int n,m,a[200000],id,x,y,k;
struct node
{
	int l,r,ne;
	int lid,rid;
}te[200000];
int init(int il,int ir)
{
	int lr=++id;
	//cout<<"lr:"<<lr<<" il:"<<il<<" ir:"<<ir<<"\n";
	te[id].l=il;
	te[id].r=ir;
	if(te[id].l==te[id].r)
	{
		te[id].ne=a[il];
		return lr;
	}
	te[lr].lid=init(il,(il+ir)/2);
	te[lr].rid=init((il+ir)/2+1,ir);
	te[lr].ne=te[te[lr].lid].ne+te[te[lr].rid].ne;
	return lr;
}
void addi(int di,int il,int ir)
{
	if(il>y||ir<x)
	{
		return;
	}
	if(il==ir)
	{
		te[di].ne+=k;
		return;
	}
	addi(te[di].lid,il,(il+ir)/2);
	addi(te[di].rid,(il+ir)/2+1,ir);
	te[di].ne=te[te[di].lid].ne+te[te[di].rid].ne;
	return;
}
int find(int di,int il,int ir)
{
	//cout<<"di:"<<di<<" il:"<<il<<" ir:"<<ir<<"\n";
	if(il>y||ir<x)
	{
		return 0;
	}
	if(il==ir)
	{
		return te[di].ne;
	}
	int ans=0;
	ans+=find(te[di].lid,il,(il+ir)/2);
	ans+=find(te[di].rid,(il+ir)/2+1,ir);
	return ans;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	init(1,n);
	for(int i=1;i<=m;i++)
	{
		int nou;
		cin>>nou;
		if(nou==1)
		{
			cin>>x>>y>>k;
			addi(1,1,n);
		}
		else
		{
			cin>>x>>y;
			cout<<find(1,1,n)<<"\n";
		}
	}
	return 0;
}

谢谢

2024/10/6 21:43
加载中...