40分,求调!
查看原帖
40分,求调!
816792
coritom楼主2024/10/4 18:37
#include<bits/stdc++.h>
#define mid (int)((lt + rt) >> 1)
#define int long long
using namespace std;
const int N = 1e6 + 5, inf = 1e18;
int n, m, q, a[N], b[N];
int valaza[N], valazi[N], valafa[N], valafi[N], valba[N], valbi[N];
//aza
void buildaza(int x, int lt, int rt){
	if(lt == rt){
		if(a[lt] >= 0) valaza[x] = a[lt];
		else valaza[x] = -inf;
		return ;
	}
	buildaza(x * 2, lt, mid);
	buildaza(x * 2 + 1, mid + 1, rt);
	valaza[x] = max(valaza[x * 2], valaza[x * 2 + 1]);
}
//azi
void buildazi(int x, int lt, int rt){
	if(lt == rt){
		if(a[lt] >= 0) valazi[x] = a[lt];
		else valazi[x] = inf;
		return ;
	}
	buildazi(x * 2, lt, mid);
	buildazi(x * 2 + 1, mid + 1, rt);
	valazi[x] = min(valazi[x * 2], valazi[x * 2 + 1]);
}
//afa
void buildafa(int x, int lt, int rt){
	if(lt == rt){
		if(a[lt] < 0) valafa[x] = a[lt];
		else valafa[x] = -inf;
		return ;
	}
	buildafa(x * 2, lt, mid);
	buildafa(x * 2 + 1, mid + 1, rt);
	valafa[x] = max(valafa[x * 2], valafa[x * 2 + 1]);
}
//afi
void buildafi(int x, int lt, int rt){
	if(lt == rt){
		if(a[lt] < 0) valafi[x] = a[lt];
		else valafi[x] = inf;
		return ;
	}
	buildafi(x * 2, lt, mid);
	buildafi(x * 2 + 1, mid + 1, rt);
	valafi[x] = min(valafi[x * 2], valafi[x * 2 + 1]);
}
//ba
void buildba(int x, int lt, int rt){
	if(lt == rt){
		valba[x] = b[lt];
		return ;
	}
	buildba(x * 2, lt, mid);
	buildba(x * 2 + 1, mid + 1, rt);
	valba[x] = max(valba[x * 2], valba[x * 2 + 1]);
}
//bi
void buildbi(int x, int lt, int rt){
	if(lt == rt){
		valbi[x] = b[lt];
		return ;
	}
	buildbi(x * 2, lt, mid);
	buildbi(x * 2 + 1, mid + 1, rt);
	valbi[x] = min(valbi[x * 2], valbi[x * 2 + 1]);
}
//aza
int queryaza(int x, int lt, int rt, int ql, int qr){
	if(lt > qr || rt < ql) return -inf;
	if(lt >= ql && rt <= qr) return valaza[x];
	return max(queryaza(x * 2, lt, mid, ql, qr), queryaza(x * 2 + 1, mid + 1, rt, ql, qr));
}
//azi
int queryazi(int x, int lt, int rt, int ql, int qr){
	if(lt > qr || rt < ql) return inf;
	if(lt >= ql && rt <= qr) return valazi[x];
	return min(queryazi(x * 2, lt, mid, ql, qr), queryazi(x * 2 + 1, mid + 1, rt, ql, qr));
}
//afa
int queryafa(int x, int lt, int rt, int ql, int qr){
	if(lt > qr || rt < ql) return -inf;
	if(lt >= ql && rt <= qr) return valafa[x];
	return max(queryafa(x * 2, lt, mid, ql, qr), queryafa(x * 2 + 1, mid + 1, rt, ql, qr));
}
//afi
int queryafi(int x, int lt, int rt, int ql, int qr){
	if(lt > qr || rt < ql) return inf;
	if(lt >= ql && rt <= qr) return valafi[x];
	return min(queryafi(x * 2, lt, mid, ql, qr), queryafi(x * 2 + 1, mid + 1, rt, ql, qr));
}
//ba
int queryba(int x, int lt, int rt, int ql, int qr){
	if(lt > qr || rt < ql) return -inf;
	if(lt >= ql && rt <= qr) return valba[x];
	return max(queryba(x * 2, lt, mid, ql, qr), queryba(x * 2 + 1, mid + 1, rt, ql, qr));
}
//bi
int querybi(int x, int lt, int rt, int ql, int qr){
	if(lt > qr || rt < ql) return inf;
	if(lt >= ql && rt <= qr) return valbi[x];
	return min(querybi(x * 2, lt, mid, ql, qr), querybi(x * 2 + 1, mid + 1, rt, ql, qr));
}
signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	cin >> n >> m >> q;
	for(int i = 1; i <= n; i++) cin >> a[i];
	for(int i = 1; i <= m; i++) cin >> b[i];
	buildafa(1, 1, n);
	buildaza(1, 1, n);
	buildafi(1, 1, n);
	buildaza(1, 1, n);
	buildba(1, 1, m);
	buildbi(1, 1, m);
	while(q--){
		int la, ra, lb, rb;
		cin >> la >> ra >> lb >> rb;
		int aza, afa, azi, afi, ba, bi;
		aza = queryaza(1, 1, n, la, ra);
		afa = queryafa(1, 1, n, la, ra);
		azi = queryazi(1, 1, n, la, ra);
		afi = queryafi(1, 1, n, la, ra);
		ba = queryba(1, 1, m, lb, rb);
		bi = querybi(1, 1, m, lb, rb);
		int maxi = -inf;
		if(aza != -inf) maxi = max(maxi, bi * aza);
		if(azi != inf) maxi = max(maxi, bi * azi);
		if(afa != -inf) maxi = max(maxi, ba * afa);
		if(afi != inf) maxi = max(maxi, ba * afi);
		cout << maxi << "\n";
	}
	return 0;
}
2024/10/4 18:37
加载中...