why 0 pts (悬关)
查看原帖
why 0 pts (悬关)
1412938
piano_pei楼主2025/2/5 22:29

rt

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10, inf = 2e9;
struct node
{
	int l, r, maxn, minn;
}ST[6][N << 2];
int a[N], b[N], n, m, q;
void push_up(int id, int ind)
{
	ST[id][ind].maxn = max(ST[id][ind << 1].maxn, ST[id][ind << 1 | 1].maxn);
	ST[id][ind].minn = min(ST[id][ind << 1].minn, ST[id][ind << 1 | 1].minn);
}
void build(int op, int ind, int l, int r)
{
	if(op == 1)
	{
		ST[0][ind].l = ST[1][ind].l = ST[2][ind].l = l;
		ST[0][ind].r = ST[1][ind].r = ST[2][ind].r = r;
	}
	else
	{
		ST[3][ind].l = ST[4][ind].l = ST[5][ind].l = l;
		ST[3][ind].r = ST[4][ind].r = ST[5][ind].r = r;
	}
	if(l == r)
	{
		if(op == 1)
		{
			if(a[l] >= 0)
			{
				ST[0][ind].maxn = ST[0][ind].minn = a[l];
				ST[1][ind].maxn = ST[1][ind].minn = inf;
			}
			else
			{
				ST[1][ind].maxn = ST[1][ind].minn = a[l];
				ST[0][ind].maxn = ST[0][ind].minn = -inf;
			}
			ST[2][ind].maxn = ST[2][ind].minn = a[l];
		}
		else
		{
			if(b[l] >= 0)
			{
				ST[3][ind].maxn = ST[3][ind].minn = b[l];
				ST[4][ind].maxn = ST[4][ind].minn = inf;
			}
			else
			{
				ST[4][ind].maxn = ST[4][ind].minn = b[l];
				ST[3][ind].maxn = ST[3][ind].minn = -inf;
			}
			ST[5][ind].maxn = ST[5][ind].minn = a[l];
		}
		return;
	}
	int mid = (l + r) >> 1;
	build(op, ind << 1, l, mid);
	build(op, ind << 1 | 1, mid + 1, r);
	if(op == 1)
		push_up(0, ind), push_up(1, ind), push_up(2, ind);
	else
		push_up(3, ind), push_up(4, ind), push_up(5, ind);
}
int ask1(int id, int ind, int tl, int tr)
{
	if(tl <= ST[id][ind].l && ST[id][ind].r <= tr)
		return ST[id][ind].maxn;
	int mid = (ST[id][ind].l + ST[id][ind].r) >> 1, res = -2e9;
	if(tl <= mid)
		res = max(res, ask1(id, ind << 1, tl, tr));
	if(tr > mid)
		res = max(res, ask1(id, ind << 1 | 1, tl, tr));
	return res;
}
int ask2(int id, int ind, int tl, int tr)
{
	if(tl <= ST[id][ind].l && ST[id][ind].r <= tr)
		return ST[id][ind].minn;
	int mid = (ST[id][ind].l + ST[id][ind].r) >> 1, res = 2e9;
	if(tl <= mid)
		res = min(res, ask2(id, ind << 1, tl, tr));
	if(tr > mid)
		res = min(res, ask2(id, ind << 1 | 1, tl, tr));
	return res;
}
int main()
{
	cin >> n >> m >> q;
	for(int i = 1;i <= n;++i)
		scanf("%d", &a[i]);
	for(int i = 1;i <= m;++i)
		scanf("%d", &b[i]);
	build(1, 1, 1, n);
	build(2, 1, 1, m);
	int l1, r1, l2, r2;
	while(q--)
	{
		scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
		ll azmax = ask1(0, 1, l1, r1), afmax = ask1(1, 1, l1, r1), amax = ask1(2, 1, l1, r1);
		ll azmin = ask2(0, 1, l1, r1), afmin = ask2(1, 1, l1, r1), amin = ask2(2, 1, l1, r1);
		ll bzmax = ask1(3, 1, l2, r2), bfmax = ask1(4, 1, l2, r2), bmax = ask1(5, 1, l2, r2);
		ll bzmin = ask2(3, 1, l2, r2), bfmin = ask2(4, 1, l2, r2), bmin = ask2(5, 1, l2, r2);
		ll ans = -1e18;
		if(abs(azmin) != inf && abs(bfmin) != inf)
			ans = max(ans, azmin * bfmin);
		if(abs(afmax) != inf && abs(bzmax) != inf)
			ans = max(ans, afmax * bzmax);
		if(bmin >= 0 && abs(azmax) != inf)
			ans = max(ans, bmin * azmax);
		else if(bmin < 0 && abs(afmin) != inf)
			ans = max(ans, bmin * afmin);
		if(bmax >= 0 && abs(azmax) != inf)
			ans = max(ans, bmax * azmax);
		else if(bmax < 0 && abs(afmin) != inf)
			ans = max(ans, bmax * afmin);
		cout << ans << "\n";
	}
	return 0;
}
2025/2/5 22:29
加载中...