WA 40 pts 求调
查看原帖
WA 40 pts 求调
765958
lottle1212楼主2024/10/15 19:29
#include <iostream>
#include <algorithm>
#include <string.h>
#include <iomanip>
#include <bitset>
#include <math.h>
#include <string>
#include <vector>
#include <queue>
#include <set>
#include <map>
#define fst first
#define scd second
#define db double
#define ll long long
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define vi vector <int>
#define pii pair <int, int>
#define sz(x) ((int)x.size())
#define ms(f, x) memset(f, x, sizeof(f))
#define L(i, j, k) for (int i=(j); i<=(k); ++i)
#define R(i, j, k) for (int i=(j); i>=(k); --i)
#define ACN(i, H_u) for (int i=H_u; i; i=E[i].nxt)
using namespace std;
template <typename INT> void rd(INT &res) {
	res=0; bool f=false; char ch=getchar();
	while (ch<'0'||ch>'9') f|=ch=='-', ch=getchar();
	while (ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+(ch^48), ch=getchar();
	res=(f?-res:res);
}
template <typename INT, typename...Args>
void rd(INT &x, Args &...y) { rd(x), rd(y...); }
//dfs
const ll INF=0x3f3f3f3f3f3f3f3f;
const int inf=0x3f3f3f3f;
const int maxn=1e5, maxlg=20;
const int N=maxn+10, lgN=maxlg+5;
int n, m, q, a[N], b[N], Min_a0[lgN][N], Min_a1[lgN][N], Max_a0[lgN][N], Max_a1[lgN][N], Min_b[lgN][N], Max_b[lgN][N];
//wmr
void ckmin(int Min[lgN][N], int i, int j) { Min[i][j]=min(Min[i-1][j], Min[i-1][j+(1<<i-1)]); }
void ckmax(int Max[lgN][N], int i, int j) { Max[i][j]=max(Max[i-1][j], Max[i-1][j+(1<<i-1)]); }
void init() {
	ms(Max_b, -0x3f); ms(Min_b, 0x3f); ms(Max_a1, -0x3f); ms(Max_a0, -0x3f); ms(Min_a1, 0x3f); ms(Min_a0, 0x3f);
	L(i, 1, n) {
		if (a[i]>=0) Max_a1[0][i]=Min_a1[0][i]=a[i];
		else Max_a0[0][i]=Min_a0[0][i]=a[i];
	}
	L(i, 1, m) Max_b[0][i]=Min_b[0][i]=b[i];
	L(i, 1, lgN)
		for (int j=1; j+(1<<i)-1<=n; ++j)
			ckmax(Max_a0, i, j), ckmax(Max_a1, i, j), ckmin(Min_a0, i, j), ckmin(Min_a1, i, j);
	L(i, 1, lgN)
		for (int j=1; j+(1<<i)-1<=m; ++j)
			ckmax(Max_b, i, j), ckmin(Min_b, i, j);
}
int query_min(int Min[lgN][N], int l, int r) {
	int s=__lg(r-l+1);
	return min(Min[s][l], Min[s][r-(1<<s)+1]);
}
int query_max(int Max[lgN][N], int l, int r) {
	int s=__lg(r-l+1);
	return max(Max[s][l], Max[s][r-(1<<s)+1]);
}
//incra
void update(ll &ans, int lx, int l, int r) {
	if (lx==inf||lx==-inf) return ;
	ans=max(ans, min((ll)lx*query_min(Min_b, l, r), (ll)lx*query_max(Max_b, l, r)));
}
//lottle
signed main() {
//	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	freopen("P8818.in", "r", stdin);
	freopen("P8818.out", "w", stdout);
	rd(n, m, q);
	L(i, 1, n) rd(a[i]);
	L(i, 1, m) rd(b[i]);
	init();
	while (q--) {
		int l1, r1, l2, r2; rd(l1, r1, l2, r2);
		ll ans=-INF;
		update(ans, query_min(Min_a0, l1, r1), l2, r2);
		update(ans, query_min(Min_a1, l1, r1), l2, r2);
		update(ans, query_max(Max_a0, l1, r1), l2, r2);
		update(ans, query_max(Max_a1, l1, r1), l2, r2);
		printf("%lld\n", ans);
	}
	return 0;
}
/*
input
3 2 2
0 1 -2
-3 4
1 3 1 2
2 3 2 2
output
0
4
*/
2024/10/15 19:29
加载中...