50pts悬关求调Orz
查看原帖
50pts悬关求调Orz
683031
JOEYyyyyfuck楼主2024/4/16 23:11

已经是全开Longlong了,inf也设置了,不知道哪里出了问题.

#include<cstdio>
#include<climits>
#include<iostream>
#include<algorithm>
using namespace std;
long long n, q;
long long a[8000005];
long long max(long long x, long long y)
{
	return x > y ? x : y;
}
struct node
{
	long long l;
	long long r;
	long long value;
	long long lazy_add;
	long long lazy_change;
	bool change;
}t[40000020];

void build(long long l, long long r, long long node_index)
{
	t[node_index].l = l;
	t[node_index].r = r;
	if (l == r)
	{
		t[node_index].value = a[l];
		return;
	}
	long long mid = l + ((r - l) >> 1);
	build(l, mid, node_index * 2);
	build(mid + 1, r, node_index * 2 + 1);
	t[node_index].value = max(t[node_index * 2].value, t[node_index * 2 + 1].value);
}

void spread(long long node_index)
{
	//下放标记时先考虑change操作 再考虑add操作
	//需要配合update函数修改的语句顺序
	if (t[node_index].change || t[node_index].lazy_add)
	{
		if (t[node_index].change)
		{
			t[node_index * 2].change = 1;
			t[node_index * 2].lazy_change = t[node_index].lazy_change;
			t[node_index * 2 + 1].change = 1;
			t[node_index * 2 + 1].lazy_change = t[node_index].lazy_change;
			t[node_index * 2].value = t[node_index].lazy_change;
			t[node_index * 2 + 1].value = t[node_index].lazy_change;
			t[node_index].change = 0;
			t[node_index * 2].lazy_add = 0;
			t[node_index * 2 + 1].lazy_add = 0;
		}
		t[node_index * 2].lazy_add += t[node_index].lazy_add;
		t[node_index * 2 + 1].lazy_add += t[node_index].lazy_add;
		t[node_index * 2].value += t[node_index].lazy_add;
		t[node_index * 2 + 1].value += t[node_index].lazy_add;
		t[node_index].lazy_add = 0;
	}
}

void update_change(long long l, long long r, long long node_index, long long value)
{
	long long node_l = t[node_index].l;
	long long node_r = t[node_index].r;
	if (l <= node_l && r >= node_r)
	{
		t[node_index].lazy_add = 0;
		t[node_index].change = 1;
		t[node_index].lazy_change = value;
		t[node_index].value = value;
		return;
	}
	spread(node_index);
	long long mid = node_l + ((node_r - node_l) >> 1);
	if (l <= mid) update_change(l, r, node_index * 2, value);
	if (r > mid) update_change(l, r, node_index * 2 + 1, value);
	t[node_index].value = max(t[node_index * 2].value, t[node_index * 2 + 1].value);
}

void update_add(long long l, long long r, long long node_index, long long value)
{
	long long node_l = t[node_index].l;
	long long node_r = t[node_index].r;
	spread(node_index);
	if (l <= node_l && r >= node_r)
	{
		t[node_index].lazy_add += value;
		//t[node_index].lazy_change = value;
		t[node_index].value += value;
		return;
	}
	long long mid = node_l + ((node_r - node_l) >> 1);
	if (l <= mid) update_add(l, r, node_index * 2, value);
	if (r > mid) update_add(l, r, node_index * 2 + 1, value);
	t[node_index].value = max(t[node_index * 2].value, t[node_index * 2 + 1].value);
}

long long query(long long l, long long r, long long node_index)
{
	long long node_l = t[node_index].l;
	long long node_r = t[node_index].r;
	if (node_l >= l && node_r <= r)
	{
		return t[node_index].value;
	}
	spread(node_index);
	long long result = LLONG_MIN;
	long long mid = node_l + ((node_r - node_l) >> 1);
	if (l <= mid) result = max(result, query(l, r, node_index * 2));
	if (r > mid) result = max(result, query(l, r, node_index * 2 + 1));
	return result;
}

int main()
{
	//long long T = LLONG_MIN;
	//printf("%lld",T);
	scanf("%d %d", &n, &q);
	for (int i = 1; i <= n; i++) scanf("%d",&a[i]);
	build(1, n, 1);
	int flag;
	long long l, r, x;
	for (int i = 1; i <= q; i++)
	{
		scanf("%d", &flag);
		switch (flag)
		{
		case 1:
			scanf("%lld %lld %lld",&l,&r,&x);
			update_change(l, r, 1, x);
			break;
		case 2:
			scanf("%lld %lld %lld",&l,&r,&x);
			update_add(l, r, 1, x);
			break;
		case 3:
			scanf("%lld %lld",&l,&r);
			printf("%lld\n", query(l, r, 1));
			break;
		}
	}
	return 0;
}
2024/4/16 23:11
加载中...