线段树 100pts Unaccepted 求助
查看原帖
线段树 100pts Unaccepted 求助
795660
DeepSeekR1楼主2024/8/19 11:08

评测记录

#include <bits/stdc++.h>
#define int long long
#define ls (p << 1)
#define rs (p << 1 | 1)
#define mid ((l + r) >> 1)
#define INF 1e18
using namespace std;
int n,m,q,a[100005],b[100005];
struct JP8 {
	int mx;
	int mn;
	int mnz;
	int mxf;
} ta[1000006],tb[1000006];
void pushup (int p) {
	ta[p].mx = max(ta[ls].mx,ta[rs].mx);
	ta[p].mn = min(ta[ls].mn,ta[rs].mn);
	ta[p].mnz = min(ta[ls].mnz,ta[rs].mnz);
	ta[p].mxf = max(ta[ls].mxf,ta[rs].mxf);
	tb[p].mx = max(tb[ls].mx,tb[rs].mx);
	tb[p].mn = min(tb[ls].mn,tb[rs].mn);
}
void build (int p,int l,int r) {
	ta[p].mx = -INF;
	ta[p].mn = INF;
	ta[p].mnz = INF;
	ta[p].mxf = -INF;
	tb[p].mx = -INF;
	tb[p].mn = INF;
	if (l == r) {
		if (l <= n) {
			ta[p].mx = a[l];
			ta[p].mn = a[l];
			if (a[l] >= 0) {
				ta[p].mnz = a[l];
			}
			if (a[l] <= 0) {
				ta[p].mxf = a[l];
			}
		}
		if (l <= m) {
			tb[p].mx = b[l];
			tb[p].mn = b[l];
			if (b[l] >= 0) {
				tb[p].mnz = b[l];
			}
			if (b[l] <= 0) {
				tb[p].mxf = b[l];
			}
		}
		return;
	}
	build(ls,l,mid);
	build(rs,mid + 1,r);
	pushup(p);
	return;
}
JP8 query (int p,int l,int r,int ql,int qr,char c) {
	if (ql <= l && r <= qr) {
		if (c == 'a') {
			return ta[p];
		} else {
			return tb[p];
		}
	}
	JP8 ret,que;
	ret.mx = -INF;
	ret.mn = INF;
	ret.mnz = INF;
	ret.mxf = -INF;
	if (ql <= mid) {
		que = query(ls,l,mid,ql,qr,c);
		ret.mx = max(ret.mx,que.mx);
		ret.mn = min(ret.mn,que.mn);
		ret.mnz = min(ret.mnz,que.mnz);
		ret.mxf = max(ret.mxf,que.mxf);
	}
	if (qr > mid) {
		que = query(rs,mid + 1,r,ql,qr,c);
		ret.mx = max(ret.mx,que.mx);
		ret.mn = min(ret.mn,que.mn);
		ret.mnz = min(ret.mnz,que.mnz);
		ret.mxf = max(ret.mxf,que.mxf);
	}
	return ret;
}
signed main () {
	cin >> n >> m >> q;
	for (int i = 1;i <= n;i++) {
		cin >> a[i];
	} 
	for (int i = 1;i <= m;i++) {
		cin >>  b[i];
	}
	build(1,1,max(n,m));
	while (q--) {
		int l1,r1,l2,r2;
		cin >> l1 >> r1 >> l2 >> r2;
		JP8 A = query(1,1,n,l1,r1,'a'),B = query(1,1,n,l2,r2,'b');
		int ans = -INF * INF;
		if (A.mx < 0) {
			if (B.mx < 0) {
				ans = A.mn * B.mx;
			} else {
				ans = A.mx * B.mx;
			}
		} else if (A.mn >= 0) {
			if (B.mn >= 0) {
				ans = A.mx * B.mn;
			} else {
				ans = A.mn * B.mn;
			}
		} else {
			if (B.mx < 0) {
				ans = A.mn * B.mx;
			} else if (B.mn >= 0) {
				ans = A.mx * B.mn;
			} else {
				if (A.mnz < INF) {
					ans = max(ans,A.mnz * B.mn);
				}
				if (A.mxf > -INF) {
					ans = max(ans,A.mxf * B.mx);
				}
			}
		}
		cout << ans << endl;
	}
	return 0;
}
2024/8/19 11:08
加载中...