求助,蒟蒻瞎写的递归式线段树,最后三个点TLE
查看原帖
求助,蒟蒻瞎写的递归式线段树,最后三个点TLE
456724
2020kanade楼主2021/9/11 14:08
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define il inline
const LL MAXN=111111;
struct node
{
	LL l,r,v,add,mid;
};
LL input[MAXN];
struct segmentTree
{
	node T[MAXN*4];
	il void init(LL s,LL t,LL o)
	{
		T[o].l=s,T[o].r=t,T[o].mid=T[o].l+((T[o].r-T[o].l)>>1);
		if(T[o].l==T[o].r) {T[o].v=input[T[o].l];return;}
		init(s,T[o].mid,o<<1);init(T[o].mid+1,t,o<<1|1);
		T[o].v=T[o<<1].v+T[o<<1|1].v;
	}
	il void update_P(LL s,LL t,LL o,LL k)
	{
		if(T[o].l==T[o].r){T[o].add+=k;return;}
		if(s<=T[o].mid) update_P(s,t,o<<1,k);if(t>T[o].mid) update_P(s,t,o<<1|1,k);
		T[o].add=T[o<<1].add+T[o<<1|1].add;
	}
	il LL query(LL s,LL t,LL o)
	{
		LL ans=0;
		if(s<=T[o].l && T[o].r<=t) return T[o].v+T[o].add;
		if(s<=T[o].mid) ans+=query(s,t,o<<1);if(T[o].mid<t) ans+=query(s,t,o<<1|1);
		return ans;
	}
}ST;
LL n,m,op,x,y,k;
int main()
{
//	freopen("P3372_8.in","r",stdin);
//	freopen("P3372_8.out","w",stdout);
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(LL i=1;i<=n;i++) cin>>input[i];
	ST.init(1,n,1);
	while(m--)
	{
		cin>>op;
		if(op==1)
		{
			cin>>x>>y>>k;ST.update_P(x,y,1,k);
		}
		else if(op==2)
		{
			cin>>x>>y;cout<<ST.query(x,y,1)<<endl;
		}
	}
	return 0;
}

感觉像是query有问题......这部分自己瞎写的,因为各种教程看不懂(悲)

顺便问一下标记持久化是什么,怎么写......

谢谢各位神犇

2021/9/11 14:08
加载中...