关于RE
查看原帖
关于RE
231543
bloodstalk楼主2022/11/2 08:23

有一个疑惑,题目中明确说到了 n,m105n,m \leq 10^5 ,因此我就开了 10510^5 的空间,可是 60pts60pts RE ,然后开到 1e61e6 就过了,有无好心人解答一下/kel

code

#include<bits/stdc++.h>
#define int long long
#define ll long long
#define next nxt
#define re register
#define il inline
const int N = 1e5 +5;//1e5 60pts , 1e6 100pts
const int INF = 1e9 + 5;
using namespace std;
int max(int x,int y){return x > y ? x : y;}
int min(int x,int y){return x < y ? x : y;}

int lg[N],a[N],b[N],n,m,q,l1,r1,l2,r2;
int MaxPosA[N][23] , MinPosA[N][23] , MaxNegA[N][23] , MinNegA[N][23];
int MaxPosB[N][23] , MinPosB[N][23] , MaxNegB[N][23] , MinNegB[N][23];

il int read()
{
	int f=0,s=0;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) f |= (ch=='-');
	for(; isdigit(ch);ch=getchar()) s = (s<<1) + (s<<3) + (ch^48);
	return f ? -s : s;
}

il void init()
{
	for(re int j=1;j<=lg[n];j++)
		for(re int i=1;i<=n;i++)
		{
			MaxPosA[i][j] = max(MaxPosA[i][j-1],MaxPosA[i+(1<<(j-1))][j-1]);
			MinPosA[i][j] = min(MinPosA[i][j-1],MinPosA[i+(1<<(j-1))][j-1]);
			MaxNegA[i][j] = max(MaxNegA[i][j-1],MaxNegA[i+(1<<(j-1))][j-1]);
			MinNegA[i][j] = min(MinNegA[i][j-1],MinNegA[i+(1<<(j-1))][j-1]);
		}
	for(re int j=1;j<=lg[m];j++)
		for(re int i=1;i<=m;i++)
		{
			MaxPosB[i][j] = max(MaxPosB[i][j-1],MaxPosB[i+(1<<(j-1))][j-1]);
			MinPosB[i][j] = min(MinPosB[i][j-1],MinPosB[i+(1<<(j-1))][j-1]);
			MaxNegB[i][j] = max(MaxNegB[i][j-1],MaxNegB[i+(1<<(j-1))][j-1]);
			MinNegB[i][j] = min(MinNegB[i][j-1],MinNegB[i+(1<<(j-1))][j-1]);
		}
}

signed main()
{
	n = read() , m = read() , q = read();
	lg[1] = 0;
	for(re int i=2;i<=max(n,m);i++) lg[i] = lg[i>>1] + 1;
	for(re int i=1;i<=n;i++)
	{
		a[i] = read(); 
		if(a[i]>=0) 
			MaxPosA[i][0]=MinPosA[i][0]=a[i],MaxNegA[i][0]=-INF,MinNegA[i][0]=INF;
	    else 
			MaxNegA[i][0]=MinNegA[i][0]=a[i],MaxPosA[i][0]=-INF,MinPosA[i][0]=INF;
	}
	for(re int i=1;i<=m;i++)
	{
		b[i] = read(); 
		if(b[i]>=0) 
			MaxPosB[i][0]=MinPosB[i][0]=b[i],MaxNegB[i][0]=-INF,MinNegB[i][0]=INF;
	    else 
			MaxNegB[i][0]=MinNegB[i][0]=b[i],MaxPosB[i][0]=-INF,MinPosB[i][0]=INF;
	}
	init();
	while(q--)
	{
		l1 = read() , r1 = read() , l2 = read() , r2 = read();
		int A[5],B[5],Lg = lg[r1-l1+1];
		int l = l1 , r = r1;
		A[1] = max(MaxPosA[l][Lg],MaxPosA[r-(1<<Lg)+1][Lg]);A[2] = min(MinPosA[l][Lg],MinPosA[r-(1<<Lg)+1][Lg]);
		A[3] = max(MaxNegA[l][Lg],MaxNegA[r-(1<<Lg)+1][Lg]);A[4] = min(MinNegA[l][Lg],MinNegA[r-(1<<Lg)+1][Lg]);
		l = l2 , r = r2 , Lg = lg[r2-l2+1];
		B[1] = max(MaxPosB[l][Lg],MaxPosB[r-(1<<Lg)+1][Lg]);B[2] = min(MinPosB[l][Lg],MinPosB[r-(1<<Lg)+1][Lg]);
		B[3] = max(MaxNegB[l][Lg],MaxNegB[r-(1<<Lg)+1][Lg]);B[4] = min(MinNegB[l][Lg],MinNegB[r-(1<<Lg)+1][Lg]);
		int ans = -1e18 - 1;
		for(re int i=1;i<=4;i++)
		{
			if(abs(A[i]) == INF) continue;
			int sum = 1e18;
			for(re int j=1;j<=4;j++)
			{
				if(abs(B[j]) == INF) continue;
				sum = min(sum,A[i]*B[j]);
			}
			ans = max(ans,sum);
		}
		cout << ans << "\n";
	}
	return 0;
}
2022/11/2 08:23
加载中...