为什么树的长度开到10^5会爆,而10^6就AC了?
查看原帖
为什么树的长度开到10^5会爆,而10^6就AC了?
353264
RainbowSheep_楼主2024/10/21 19:15

好像我这份代码才会出现这种问题

还有,为什么要在每次区间操作的时候都要 pushdown.... 附代码:

//https://www.luogu.com.cn/problem/P3372
#include <iostream>
using namespace std;

#define MAX 100010
#define ROOT 1

struct segment
{
	int l,r;
	long long val,lazy;
}segtree[MAX*4];

int a[MAX],n,m,x,y,op;
long long k;

void build(int p,int l,int r)
{
	segtree[p].l=l;
	segtree[p].r=r;
	if(l==r)
	{
		segtree[p].val=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	segtree[p].val=segtree[p*2].val+segtree[p*2+1].val;
}

inline void pd(int p)
{
	if(!segtree[p].lazy)
		return;

	if(segtree[p].l!=segtree[p].r)
	{
		segtree[p*2].lazy+=segtree[p].lazy;
		segtree[p*2+1].lazy+=segtree[p].lazy;
	}
	segtree[p*2].val+=segtree[p].lazy*(segtree[p*2].r-segtree[p*2].l+1);
	segtree[p*2+1].val+=segtree[p].lazy*(segtree[p*2+1].r-segtree[p*2+1].l+1);
	segtree[p].lazy=0;
}

void add(long long x,int l,int r,int p=ROOT)
{
	pd(p);
//	cout << segtree[p].l << ',' << segtree[p].r << ':' << segtree[p].val << endl;
	if(l<=segtree[p].l&&r>=segtree[p].r)
	{
		segtree[p].val+=x*(segtree[p].r-segtree[p].l+1);
		segtree[p].lazy+=x;
//		cout << segtree[p].l << ',' << segtree[p].r << ':' << segtree[p].val << endl;
		return;
	}
	int mid=(segtree[p].l+segtree[p].r)/2;
	if(r<=mid)
		add(x,l,r,p*2);
	else if(l>mid)
		add(x,l,r,p*2+1);
	else
	{
		add(x,l,r,p*2);
		add(x,l,r,p*2+1);
	}
	segtree[p].val=segtree[p*2].val+segtree[p*2+1].val;
//	cout << segtree[p].l << ',' << segtree[p].r << ':' << segtree[p].val << endl;
}


long long query(int l,int r,int p=ROOT)
{
	pd(p);
	if(l<=segtree[p].l&&r>=segtree[p].r)
		return segtree[p].val;

	int mid=(segtree[p].l+segtree[p].r)/2;
	if(r<=mid)
		return query(l,r,p*2);
	else if(l>mid)
		return query(l,r,p*2+1);

	return query(l,r,p*2)+query(l,r,p*2+1);
}

int main()
{
	ios::sync_with_stdio(false);
	cin >> n >> m;
	for(int i = 1;i<=n;i++)
		cin >> a[i];

	build(ROOT,1,n);
	while(m--)
	{
		cin >> op >> x >> y;
		switch(op)
		{
		case 1:
			cin >> k;
			add(k,x,y);
			break;
		case 2:
			cout << query(x,y) << endl;
		}
	}
	return 0;
}
2024/10/21 19:15
加载中...