25分RE求助
查看原帖
25分RE求助
999274
CNS_5t0_0r2楼主2023/9/15 21:19

https://www.luogu.com.cn/record/124829413

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5,LOGN = 25;
int Log2[LOGN + 9];
int n,m,q;
int a[N + 9],b[N + 9];
int l1,r1,l2,r2;
int ST1[N + 9][LOGN + 9],ST2[N + 9][LOGN + 9];
int ST3[N + 9][LOGN + 9],ST4[N + 9][LOGN + 9];
int ST5[N + 9][LOGN + 9],ST6[N + 9][LOGN + 9];
void init_log2(){
	for(int i = 2;i <= max(n,m);i++)
		Log2[i] = Log2[i >> 1] + 1;
}
void init_ST_a(){
	for(int i = 1;i <= n;i++)
		ST1[i][0] = ST2[i][0] = a[i];
	for (int j = 1; j <= Log2[n];j++){
		for (int i = 1; i + (1 << j) - 1 <= n; i++) {
	    	int r = i + (1 << (j - 1));
	        ST1[i][j] = max(ST1[i][j - 1], ST1[r][j - 1]);
	        ST2[i][j] = min(ST2[i][j - 1], ST2[r][j - 1]);
	    }
	}
}
void init_ST_b(){
	for(int i = 1;i <= m;i++)
		ST3[i][0] = ST4[i][0] = b[i];
	for (int j = 1; j <= Log2[m];j++){
		for (int i = 1; i + (1 << j) - 1 <= m; i++) {
	    	int r = i + (1 << (j - 1));
	        ST3[i][j] = max(ST3[i][j - 1], ST3[r][j - 1]);
	        ST4[i][j] = min(ST4[i][j - 1], ST4[r][j - 1]);
	    }
	}
}
void init_ST_Z(){
	for(int i = 1;i <= n;i++){
		ST5[i][0] = a[i] < 0 ? a[i] : LLONG_MIN;
		ST6[i][0] = a[i] >= 0 ? a[i] : LLONG_MAX;
	}
	for (int j = 1; j <= Log2[n];j++){
		for (int i = 1; i + (1 << j) - 1 <= n; i++) {
	    	int r = i + (1 << (j - 1));
	        ST5[i][j] = max(ST5[i][j - 1], ST5[r][j - 1]);
	        ST6[i][j] = min(ST6[i][j - 1], ST6[r][j - 1]);
	    }
	}
}
void init(){
	init_log2();
	init_ST_a();
	init_ST_b();
	init_ST_Z();
}
int len(int l,int r){
	return r - l + 1;
}
int solution(){
    int len1 = len(l1,r1),len2 = len(l2,r2);
	int L1 = Log2[len1],L2 = Log2[len2];
	int pos1 = r1 - (1 << L1) + 1, pos2 = r2 - (1 << L2) + 1;
	int ret;
	int a_max = max(ST1[l1][L1], ST1[pos1][L1]);
	int a_min = min(ST2[l1][L1], ST2[pos1][L1]);
	int b_max = max(ST3[l2][L2], ST3[pos2][L2]);
	int b_min = min(ST4[l2][L2], ST4[pos2][L2]);
	int a_Z_max = max(ST5[l1][L1], ST5[pos1][L1]);
	int a_Z_min = min(ST6[l1][L1], ST6[pos1][L1]);
	int ans1 = a_max * (a_max >= 0 ? b_min : b_max);
	int ans2 = a_min * (a_min >= 0 ? b_min : b_max);
	if (a_Z_max != LLONG_MIN)
	    ans1 = max(ans1,a_Z_max * (a_Z_max >= 0 ? b_min : b_max));
	if (a_Z_min != LLONG_MAX)
	    ans2 = max(ans2,a_Z_min * (a_Z_min >= 0 ? b_min : b_max));
	ret = max(ans1,ans2);
	return ret;
}
signed main(){
	scanf("%lld%lld%lld", &n, &m, &q);
	for(int i = 1;i <= n;i++)
		scanf("%lld", &a[i]);
	for(int i = 1;i <= m;i++)
		scanf("%lld", &b[i]);
	init();
	for(;q;q--){
		scanf("%lld%lld%lld%lld", &l1, &r1 ,&l2, &r2);
		printf("%lld\n", solution());
	}
	return 0;
}
2023/9/15 21:19
加载中...