mxqz read- expect0 wa*3
查看原帖
mxqz read- expect0 wa*3
390770
D2T1xubiaoshi楼主2022/11/13 15:49
/*
    name: [CSP-S 2022] 策略游戏
    id:   P8818
    date: 2022/11/8
*/

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 1e5 + 10, M = 8e5 + 10, K = 1e9 + 10;
int n, m, qr;
ll tmp[8], rc[4];
ll a[N*2];

struct res{
	int a, b, c, d, e;
};

int f[M][5];//mx+,mn+,mx-,mn-,0

void update(int p){
	f[p][0] = max(f[p<<1][0], f[p<<1|1][0]);
	f[p][1] = min(f[p<<1][1], f[p<<1|1][1]);
	f[p][2] = max(f[p<<1][2], f[p<<1|1][2]);
	f[p][3] = min(f[p<<1][3], f[p<<1|1][3]);
	f[p][4] = f[p<<1][4] | f[p<<1|1][4]; 
}
void build(int p, int l, int r){
	if(l == r){
		if(a[l] > 0){
			f[p][0] = a[l];
			f[p][1] = a[l] - K;
		} else if(a[l] < 0){
			f[p][2] = - a[l];
			f[p][3] = - a[l] - K;
		} else {
			f[p][4] = 1;
		}
	} else {
		int mid = l + r >> 1;
		build(p<<1, l, mid);
		build(p<<1|1, mid+1, r);
		update(p);
	}
}
res query(int p, int l, int r, int ql, int qr){
	if(l > qr || r < ql){
		return (res){ 0, 0, 0, 0, 0 };
	}
	if(ql <= l && r <= qr){
		return (res){ f[p][0], f[p][1], f[p][2], f[p][3], f[p][4] };
	}
	int mid = l + r >> 1;
	res x = query(p<<1, l, mid, ql, qr);
	res y = query(p<<1|1, mid+1, r, ql, qr);
	res ans;
	ans.a = max(x.a, y.a);
	ans.b = min(x.b, y.b);
	ans.c = max(x.c, y.c);
	ans.d = min(x.d, y.d);
	ans.e = x.e | y.e;
	return ans;
}

int main(){
	scanf("%d", &n);
	scanf("%d", &m);
	scanf("%d", &qr);
	for(int i = 1; i <= n + m; ++ i){
		scanf("%lld", &a[i]);
	}
	build(1, 1, n+m);
	for(int i = 1; i <= qr; ++ i){
		int l1, r1, l2, r2;
		scanf("%d", &l1);
		scanf("%d", &r1);
		scanf("%d", &l2);
		scanf("%d", &r2);
		l2 += n, r2 += n;
		res xx = query(1, 1, n+m, l1, r1);
		res yy = query(1, 1, n+m, l2, r2);
		ll ans = -2e18;
		if(xx.e){
			ans = 0;
		}
		tmp[0] = xx.a;
		tmp[1] = xx.b + K;
		tmp[2] = - xx.c;
		tmp[3] = - xx.d - K;
		tmp[4] = yy.a;
		tmp[5] = yy.b + K;
		tmp[6] = - yy.c;
		tmp[7] = - yy.d - K;
		if(tmp[1] == K){
			tmp[1] = 0;
		}
		if(tmp[3] == -K){
			tmp[3] = 0;
		}
		if(tmp[5] == K){
			tmp[5] = 0;
		}
		if(tmp[7] == -K){
			tmp[7] = 0;
		}
		for(int p = 0; p < 4; ++ p){
			int top = 0;
			for(int q = 4; q < 8; ++ q){
				if(tmp[p] && tmp[q]){
					rc[++top] = tmp[p] * tmp[q];
				}
			}
			sort(rc + 1, rc + top + 1);
			if(top){
				ans = max(ans, rc[1]);
			}
		}
		printf("%lld\n", ((ans > 0) && yy.e) ? 0 : ans);
	}
	return 0;
}


2022/11/13 15:49
加载中...