求大佬帮忙看看,30分线段树调了好久实在找不出问题
查看原帖
求大佬帮忙看看,30分线段树调了好久实在找不出问题
574945
SCAU_anpuren楼主2022/4/16 12:14
#include<iostream>
#include<algorithm>
#include<math.h>
#include<map>
#include<string>
using namespace std;
typedef int ll;
const int inf = 0x3f3f3f3f;
struct node
{
	ll l, r, lazy, num;
}t[4000050];
ll a[1000005];
void build(int p, int x, int y)
{
	t[p].l = x;
	t[p].r = y;
	if (x == y) { t[p].num = a[x]; return; }
	ll mid = (x + y) / 2;
	if (mid >= x)build(p * 2, x, mid);
	if (mid < y)build(p * 2 + 1, mid + 1, y);
	t[p].num = max(t[p * 2].num, t[p * 2 + 1].num);
}
void spread(ll p)
{
	if (t[p].lazy)
	{
		t[p * 2].lazy += t[p].lazy;
		t[p * 2 + 1].lazy += t[p].lazy;
		t[p * 2].num += t[p].lazy;
		t[p * 2 + 1].num += t[p].lazy;
		t[p].lazy = 0;
	}
}
ll ans;
map<ll, ll>vis;
ll vi;
void ask(ll p, ll x, ll y)
{
	if (t[p].l >= x && t[p].r <= y)
	{
		if (t[p].l == t[p].r)
		{
			if (ans < t[p].num)
			{
				ans = t[p].num;
				vi = t[p].l;
			}
			else if (ans == t[p].num)
			{
				if (t[p].l > vi)
				{
					vi = t[p].l;
				}
			}
		}
		else
		{
			ll mid = (t[p].l + t[p].r) / 2;
			if (mid >= x && t[p].num == t[p * 2].num)
			{
				ask(p * 2, x, y);
			}
			if (mid < y&&t[p * 2 + 1].num == t[p].num)
			{
				ask(p * 2 + 1, x, y);
			}
		}
		t[p].num = max(t[p * 2].num, t[p * 2 + 1].num);
		return;
	}
	spread(p);
	ll mid = (t[p].l + t[p].r) / 2;
	if (mid >= x)
	{
		ask(p * 2, x, y);
	}
	if (mid < y)
	{
		ask(p * 2 + 1, x, y);
	}
	t[p].num=max(t[p * 2].num, t[p * 2 + 1].num);
}
void update(ll p, ll x, ll y, ll z)
{
	if (t[p].l >= x && t[p].r <= y)
	{
		t[p].lazy += z;
		t[p].num += z;
		return;
	}
	spread(p);
	ll mid = (t[p].l + t[p].r) / 2;
	if (mid >= x)
	{
		update(p * 2, x, y, z);
	}
	if (mid < y)
	{
		update(p * 2 + 1, x, y, z);
	}
	t[p].num = max(t[p * 2].num, t[p * 2 + 1].num);
}
void fyw(ll p, ll x, ll y)
{
	if (t[p].l == t[p].r&&t[p].l == x)
	{
		if (!vis[t[p].l]) 
		{
			vis[t[p].l] = 1;
			t[p].num = y - t[p].num + inf;
		}
		else
		{
			t[p].num -= inf;
			t[p].num = y - t[p].num + inf;
		}
		return;
	}
	ll mid = (t[p].l + t[p].r) / 2;
	spread(p);
	if (mid >= x)
	{
		fyw(p * 2, x, y);
	}
	else
	{
		fyw(p * 2 + 1, x, y);
	}
	t[p].num = max(t[p * 2].num, t[p * 2 + 1].num);
}
ll sum;
int main()
{
	std::ios::sync_with_stdio(false);
	ll n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	build(1, 1, n);
	while (m--)
	{
		ll x, y, z;
		cin >> x;
		if (x == 1)
		{
			cin >> y >> z;
			fyw(1, y, z);
		}
		else if (x == 2)
		{
			cin >> y >> z;
			ans = -0x3f3f3f3f;
			vi = 0;
			ask(1, y, z);
			update(1, vi, vi, -ans);
			if (vis[vi] == 1)
			{
				ans -= inf;
				vis[vi] = 0;
			}
			cout << ans << endl;
			sum += ans;
		}
		else if (x == 3)
		{
			cin >> x >> y >> z;
			update(1, x, y, z);
		}
	}
	if (sum < 10000)
	{
		cout << "QAQ";
	}
	else if (sum >= 10000 && sum < 10000000)
	{
		cout << "Sakura";
	}
	else
	{
		cout << "ice";
	}
}
2022/4/16 12:14
加载中...