0pts求条!
查看原帖
0pts求条!
827873
abc1856896楼主2024/10/10 17:54
#include<bits/stdc++.h>
#define int long long
using namespace std;
int XINF=LONG_LONG_MAX;
int NINF=LONG_LONG_MIN;
int n,m,q,a[100005],b[100005];
int amx[100005][25],amn[100005][25],afx[100005][25],azn[100005][25];
int bmx[100005][25],bmn[100005][25];
inline bool gmx(int &a, int b) {
    return b > a ? a = b, true : false;
}
signed main() {
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++) {
		cin>>a[i];
		amx[i][0]=a[i];
		amn[i][0]=a[i];
		afx[i][0]=(a[i]<0?a[i]:NINF);
		azn[i][0]=(a[i]>=0?a[i]:XINF);
	}
	for(int i=1;i<=m;i++) {
		cin>>b[i];
		bmx[i][0]=b[i];
		bmn[i][0]=b[i];
	}
	for(int j=1;j<=23;j++) {
		for(int i=1;i+(1<<j)-1<=m;i++) {
			bmx[i][j]=max(bmx[i][j-1],bmx[i+1<<(j-1)][j-1]);
			bmn[i][j]=min(bmn[i][j-1],bmn[i+1<<(j-1)][j-1]);
		}
	}
	for(int j=1;j<=23;j++) {
		for(int i=1;i+(1<<j)-1<=n;i++) {
			amx[i][j]=max(amx[i][j-1],amx[i+1<<(j-1)][j-1]);
			afx[i][j]=max(afx[i][j-1],afx[i+1<<(j-1)][j-1]);
			amn[i][j]=min(amn[i][j-1],amn[i+1<<(j-1)][j-1]);
			azn[i][j]=min(azn[i][j-1],azn[i+1<<(j-1)][j-1]);
		}
	}
	while(q--) {
		int la,ra,lb,rb;
		cin>>la>>ra>>lb>>rb;
		int k=log2(ra-la+1);
		int kk=log2(rb-lb+1);
		int amax=max(amx[la][k],amx[ra-(1<<k)+1][k]);
		int amin=min(amn[la][k],amn[ra-(1<<k)+1][k]);
		int afmx=max(afx[la][k],afx[ra-(1<<k)+1][k]);
		int azmn=min(azn[la][k],azn[ra-(1<<k)+1][k]);
		int bmax=max(bmx[lb][kk],bmx[rb-(1<<kk)+1][kk]); 
		int bmin=min(bmn[lb][kk],bmn[rb-(1<<kk)+1][kk]); 
		int ans=NINF;
		gmx(ans, amax * (amax >= 0 ? bmin : bmax));
        gmx(ans, amin * (amin >= 0 ? bmin : bmax));
        if (afmx != NINF)
            gmx(ans, afmx * (afmx >= 0 ? bmin : bmax));
        if (azmn != XINF)
            gmx(ans, azmn * (azmn >= 0 ? bmin : bmax));
        printf("%lld\n", ans);
	}
	return 0;
} 
/*
B:x>=0 就选择尽可能小的
   x<0  最大的
A: 
1.x>=0 如果y<0,x=大于0里最小的
       如果y>=0,x=最大的
2.x<0 如果y<0,x=最小的
      如果y>=0,x=最大的
	  int query(int l,int r) {
	int k=log2(r-l+1);
	return max(st[l][k],st[r-(1<<k)+1][k]);
}
	   
*/
2024/10/10 17:54
加载中...