ST表不能过吗???
查看原帖
ST表不能过吗???
576934
Kevin_Mamba楼主2022/10/29 21:23
#include<bits/stdc++.h>
#define re register
#define il inline
using namespace std;

const int N=1e5+20;

int n,m,q,l1,l2,r1,r2,k;

int log_2[N],mx[N][20],mn[N][20],mx2[N][20],mn2[N][20];

int mx3[N][20],mn3[N][20];//大负小正 

bool zero[N][20],ok;

int d1,d2,x1,x2,d3,x3;

long long ans;

il void pre()
{
	log_2[1]=0;
	for(re int i=2;i<=2e5;i++)
	{
		log_2[i]=log_2[i>>1]+1;
	}
}

il void st()
{
	for(re int j=1;j<=log_2[n];j++)
	{
		for(re int i=1;i+(1<<j)-1<=n;i++)
		{
			mx[i][j]=max(mx[i][j-1],mx[i+(1<<j-1)][j-1]);
			mn[i][j]=min(mn[i][j-1],mn[i+(1<<j-1)][j-1]);
			zero[i][j]=zero[i][j-1]|zero[i+(1<<j-1)][j-1];
//			cout<<i<<" "<<j<<" "<<mx[i][j]<<endl;
			mx3[i][j]=max(mx3[i][j-1],mx3[i+(1<<j-1)][j-1]);
			mn3[i][j]=min(mn3[i][j-1],mn3[i+(1<<j-1)][j-1]);
		}
	}
	for(re int j=1;j<=log_2[m];j++)
	{
		for(re int i=1;i+(1<<j)-1<=n;i++)
		{
			mx2[i][j]=max(mx2[i][j-1],mx2[i+(1<<j-1)][j-1]);
			mn2[i][j]=min(mn2[i][j-1],mn2[i+(1<<j-1)][j-1]);
		}
	}
} 

il void provide()
{
	k=log_2[r1-l1+1];
	d1=max(mx[l1][k],mx[r1-(1<<k)+1][k]);
	x1=min(mn[l1][k],mn[r1-(1<<k)+1][k]);
	ok=zero[l1][k]|zero[r1-(1<<k)+1][k];
	d3=max(mx3[l1][k],mx3[r1-(1<<k)+1][k]);
	x3=min(mn3[l1][k],mn3[r1-(1<<k)+1][k]);
	k=log_2[r2-l2+1];
	d2=max(mx2[l2][k],mx2[r2-(1<<k)+1][k]);
	x2=min(mn2[l2][k],mn2[r2-(1<<k)+1][k]);
}

int main()
{
//	freopen("game.in","r",stdin);
//	freopen("game.out","w",stdout);
	scanf("%d%d%d",&n,&m,&q);
	pre();
	for(re int i=1;i<=n;i++)
	{
		scanf("%d",&mx[i][0]);
		mn[i][0]=mx[i][0];
		if(mx[i][0]==0) zero[i][0]=true;
		if(mx[i][0]<0) mx3[i][0]=mx[i][0];
		else mx3[i][0]=INT_MIN;
		if(mx[i][0]>0) mn3[i][0]=mx[i][0];
		else mn3[i][0]=INT_MAX;
	}
	for(re int i=1;i<=m;i++)
	{
		scanf("%d",&mx2[i][0]);
		mn2[i][0]=mx2[i][0];
	}
	st();
	while(q--)
	{
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		provide();		
//		cout<<x1<<" "<<d1<<" "<<x2<<" "<<d2<<endl;	
		if(x2>0)
		{
			if(d1>0)
			{
				printf("%lld\n",(long long)d1*x2);
				continue;
			}
			if(d1<0)
			{
				printf("%lld\n",(long long)d1*d2);
				continue;
			}
			puts("0");
			continue;
		}
		if(x2<0&&d2<0)
		{
			if(x1>0)
			{
				printf("%lld\n",(long long)x1*x2);
				continue;
			}
			if(x1<0)
			{
				printf("%lld\n",(long long)x1*d2);
				continue;
			}
			puts("0");
			continue;
		}
		// x2<0 d2>0
		if(x1<0&&d1<0)
		{
			printf("%lld\n",(long long)d1*d2);
			continue;
		}
		if(x1>0&&d1>0)
		{
			printf("%lld\n",(long long)x1*x2);
			continue;
		}
		// x1<0 d1>0
		ans=max((long long)d3*d2,(long long)x3*x2);
		if(ans<0&&(ok)) ans=0;
		printf("%lld\n",ans);
	}
	return 0;
}
2022/10/29 21:23
加载中...