50分求调,想了1个月了没想出为啥错了
查看原帖
50分求调,想了1个月了没想出为啥错了
204954
Wogua_boy楼主2024/10/9 10:58
#include <bits/stdc++.h>

const int N = 1e5 + 5;
const long long inf = 1e18;
struct Node
{
	long long Max;
	long long Min;
	long long _Min; // _Min >= 0
	long long _Max; // _Max <= 0
}node[2][N << 2];
long long a[2][N];

void pushup(Node & u, Node & lson, Node & rson)
{
	u.Max = std::max(lson.Max, rson.Max);
	u.Min = std::min(lson.Min, rson.Min);
	u._Min = std::min(lson._Min, rson._Min);
	u._Max = std::max(lson._Max, rson._Max);
}
void merge(Node & u, Node v)
{
	u.Max = std::max(u.Max, v.Max);
	u.Min = std::min(u.Min, v.Min);
	u._Min = std::min(u._Min, v._Min);
	u._Max = std::max(u._Max, v._Max);
}
void build(int f, int i, int l, int r)
{
	if (l == r) 
	{
		node[f][i].Max = node[f][i].Min = a[f][l];
		node[f][i]._Max = -inf;
		node[f][i]._Min = inf;
		if (a[f][l] >= 0) node[f][i]._Min = std::min(node[f][i]._Min, a[f][l]);
		if (a[f][l] <= 0) node[f][i]._Max = std::max(node[f][i]._Max, a[f][l]);
		return;
	}
	int mid = (l + r) >> 1;
	build(f, i << 1, l, mid);
	build(f, i << 1 | 1, mid + 1, r);
	pushup(node[f][i], node[f][i << 1], node[f][i << 1 | 1]);
}

Node query(int f, int i, int l, int r, int L, int R)
{
	if (l >= L && r <= R) return node[f][i];
	int mid = (l + r) >> 1;
	Node ans;
	ans.Max = ans._Max = -inf;
	ans.Min = ans._Min = inf;
	if (L <= mid) merge(ans, query(f, i << 1, l, mid, L, R));
	if (R > mid) merge(ans, query(f, i << 1 | 1, mid + 1, r, L, R));
	return ans;
}

int main ()
{
	int n, m, q;
	std::cin >> n >> m >> q;
	for (int i = 1; i <= n; i++) std::cin >> a[0][i];
	for (int i = 1; i <= m; i++) std::cin >> a[1][i];
	build(0, 1, 1, n);
	build(1, 1, 1, m);
	while (q--)
	{
		int A, B, C, D;
		std::cin >> A >> B >> C >> D;
		Node t1 = query(0, 1, 1, n, A, B);
		Node t2 = query(1, 1, 1, m, C, D);
		long long ans = -2e18;
		if (t2.Min >= 0)
		{
			ans = std::max(ans, t1.Max * t2.Min);
		}
		else if (t2.Min < 0 && t2.Max >= 0)
		{
			if (t1._Min != inf) ans = std::max(ans, t1._Min * t2.Min);
			if (t1._Max != -inf) ans = std::max(ans, t1._Max * t2.Max);
		}
		else
		{
			if (t1.Min <= 0) ans = std::max(ans, t1.Min * t2.Max);
			else ans = std::max(ans, t1.Min * t2.Min);
		}
		
		std::cout << ans << "\n";
	}
	return 0;
}
2024/10/9 10:58
加载中...