求调
  • 板块灌水区
  • 楼主Martlet
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/8/23 17:28
  • 上次更新2023/11/3 01:42:41
查看原帖
求调
543717
Martlet楼主2023/8/23 17:28

link

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const long long INF = 1e17;
struct ST{
	long long lg[maxn],st_min[maxn][19],st_max[maxn][19];
	void init(long long a[],int n){
		lg[0] = -1;
		for(int i = 1;i <= n;i++){
			lg[i] = lg[i/2]+1;
			st_min[i][0] = st_max[i][0] = a[i];
			if(a[i] == INF){
			    st_max[i][0] = -INF;
			   // cout<<st_max[i][0]<<endl;
		    }
		}
		for(int j = 1;j <= lg[n];j++){
			for(int i = 1;i <= n;i++){
			    st_min[i][j] = min(st_min[i][j-1],st_min[i+(1<<j-1)][j-1]);	
				st_max[i][j] = max(st_max[i][j-1],st_max[i+(1<<j-1)][j-1]);		
			}
		}
	}
	long long qmin(int l,int r){
		int k = lg[r-l+1];
		return min(st_min[l][k],st_min[r-(1<<k)+1][k]);
	}
	long long qmax(int l,int r){
		int k = lg[r-l+1];
		return max(st_max[l][k],st_max[r-(1<<k)+1][k]);
	}
}A1,A2,B1,B2;
long long a1[maxn],a2[maxn],b1[maxn],b2[maxn],a[maxn],b[maxn];
int main(){
	//freopen("game.in","r",stdin);
	//freopen("game.out","w",stdout);
	int n,m,q;
	cin>>n>>m>>q;
	for(int i = 1;i <= n;i++){
		cin>>a[i];
		a1[i] = a2[i] = a[i];
		if(a[i] < 0) a1[i] = INF;
		if(a[i] > 0)a2[i] = INF;
	}
	for(int i = 1;i <= m;i++){
		cin>>b[i];
		b1[i] = b2[i] = b[i];
		if(b[i] < 0) b1[i] = INF;
		if(b[i] > 0)b2[i] = INF;
	}
	A1.init(a1,n);
	A2.init(a2,n);
	B1.init(b1,m);
	B2.init(b2,m);
	while(q--){
		int l1,r1,l2,r2;
		cin>>l1>>r1>>l2>>r2;
		vector<long long> v1 = {A1.qmin(l1,r1),A2.qmin(l1,r1),A1.qmax(l1,r1),A2.qmax(l1,r1)};
		vector<long long> v2 = {B1.qmin(l2,r2),B2.qmin(l2,r2),B1.qmax(l2,r2),B2.qmax(l2,r2)};
		long long ret = -INF;
		for(long long p1:v1)if(abs(p1) != INF){
			long long tmp = INF;
			for(long long p2:v2)if(abs(p2) != INF){
				//cout<<p1<<" "<<p2<<endl;
				tmp = min(tmp,p1 * p2);
			}
			ret = max(ret,tmp);
		}
		cout<<ret<<endl;
	}
} 
2023/8/23 17:28
加载中...