线段树,样例过了但0分
查看原帖
线段树,样例过了但0分
545975
Nyoom楼主2023/10/20 20:42
#include<bits/stdc++.h>
using namespace std;
const int nMax = 100005, mMax = 100005;
int n, m, q, l1, r1, l2, r2;
int a[nMax], b[mMax], la[5], lb[5];
long long ans; 
long long pre[5];
struct Node{
	int l, r, mx, mn, pmn, nmx;
}t1[4*nMax], t2[4*mMax];
void pushUp1(int cur){
	if(t1[cur].l == t1[cur].r){
		return ;
	}
	t1[cur].mx = max(t1[cur<<1].mx, t1[(cur<<1) + 1].mx);
	t1[cur].mn = min(t1[cur<<1].mn, t1[(cur<<1) + 1].mn);
	t1[cur].pmn = min(t1[cur<<1].pmn, t1[(cur<<1) + 1].pmn);
	t1[cur].nmx = max(t1[cur<<1].nmx, t1[(cur<<1) + 1].nmx);
	return ;
}
void build1(int L, int R, int cur){
	t1[cur].l = L, t1[cur].r = R;
	if(L == R){
		t1[cur].mx = a[L];
		t1[cur].mn = a[L];
		t1[cur].pmn = (a[L] >= 0)? a[L] : INT_MAX;
		t1[cur].nmx = (a[L] < 0)? a[L] : INT_MIN;
		return ;
	}
	build1(L, (L + R)>>1, cur<<1);
	build1(((L + R)>>1) + 1, R, (cur<<1) + 1);
	pushUp1(cur);
	return ;
}
int query1(int L, int R, int cur, int opt){ // 1-mx, 2-mn, 3-pmn, 4-nmx.
	if(t1[cur].r < L || t1[cur].l > R){
		if(opt == 1) return INT_MIN;
		else if(opt == 2) return INT_MAX;
		else if(opt == 3) return INT_MAX; 
		else return INT_MIN;
	}
	if(t1[cur].l >= L && t1[cur].r <= R){
		if(opt == 1) return t1[cur].mx;
		else if(opt == 2) return t1[cur].mn;
		else if(opt == 3) return t1[cur].pmn;
		else return t1[cur].nmx;
	}
	int tmp1 = query1(L, R, cur<<1, opt), tmp2 = query1(L, R, (cur<<1) + 1, opt);
	if(opt == 1) return max(tmp1, tmp2);
	else if(opt == 2) return min(tmp1, tmp2);
	else if(opt == 3) return min(tmp1, tmp2);
	else return max(tmp1, tmp2);
}
void pushUp2(int cur){
	if(t2[cur].l == t2[cur].r){
		return ;
	}
	t2[cur].mx = max(t2[cur<<1].mx, t2[(cur<<1) + 1].mx);
	t2[cur].mn = min(t2[cur<<1].mn, t2[(cur<<1) + 1].mn);
	return ;
}
void build2(int L, int R, int cur){
	t2[cur].l = L, t2[cur].r = R;
	if(L == R){
		t2[cur].mx = b[L];
		t2[cur].mn = b[L];
		return ;
	}
	build2(L, (L + R)>>1, cur<<1);
	build2(((L + R)>>1) + 1, R, (cur<<1) + 1);
	pushUp2(cur);
	return ;
}
int query2(int L, int R, int cur, int opt){ // 1-mx, 2-mn, 3-pmn, 4-nmx.
	if(t2[cur].r < L || t2[cur].l > R){
		if(opt == 1) return INT_MIN;
		else return INT_MAX;
	}
	if(t2[cur].l >= L && t2[cur].r <= R){
		if(opt == 1) return t2[cur].mx;
		else return t2[cur].mn;
	}
	int tmp1 = query2(L, R, cur<<1, opt), tmp2 = query2(L, R, (cur<<1) + 1, opt);
	if(opt == 1) return max(tmp1, tmp2);
	else return min(tmp1, tmp2);
}
int 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];
	}
	build1(1, n, 1);
	build2(1, m, 1);
	while(q--){ // 1-mx, 2-mn, 3-pmn, 4-nmx.
		cin >> l1 >> r1 >> l2 >> r2; 
		for(int i = 1; i <= 4; i++){
			la[i] = query1(l1, r1, 1, i);
		}
		for(int i = 1; i <= 2; i++){
			lb[i] = query2(l2, r2, 1, i);
		}
		ans = LONG_LONG_MIN;
		for(int i = 1; i <= 4; i++){
			pre[i] = LONG_LONG_MIN;
			if(la[i] >= 0){
				pre[i] = la[i]*lb[2];
			}else{
				pre[i] = la[i]*lb[1];
			}
			ans = max(ans, pre[i]);
		}
		printf("%lld\n", ans); // .
	}
	return 0;
}
2023/10/20 20:42
加载中...