求助ST表 0pts
查看原帖
求助ST表 0pts
554665
Dream__Sky楼主2023/7/19 11:44
#include <bits/stdc++.h>
#define int long long
#define log(n) log2(n)
using namespace std;
const int INF=1e18;
int n,m,q,Max[100010][21],Min[100010][21],Mxx[100010][21],Mnn[100010][21],Mbx[100010][21],Mbn[100010][21];
signed main()
{
//	freopen("game4.in","r",stdin);
//	freopen("game4.out","w",stdout);
	cin>>n>>m>>q;
	for(int i=1,x;i<=n;i++)
	{
		cin>>x;
		Max[i][0]=Min[i][0]=x;
		Mxx[i][0]=(x>=0?-INF:x);
		Mnn[i][0]=(x<0?INF:x);//Max,Min为最值,Mxx为负数最大值,Mnn为正数最小值 
	}
	for(int i=1,x;i<=m;i++)
	{
		cin>>x;
		Mbx[i][0]=Mbn[i][0]=x; 
	}
	
	for(int i=1;i<=log(n);i++)
	{
		for(int j=1;j<=n-(1<<i)+1;j++)
		{
			Max[j][i]=max(Max[j][i-1],Max[j+(1<<(i-1))][i-1]);
			Mxx[j][i]=max(Mxx[j][i-1],Mxx[j+(1<<(i-1))][i-1]);
			Min[j][i]=min(Min[j][i-1],Min[j+(1<<(i-1))][i-1]);
			Mnn[j][i]=min(Mnn[j][i-1],Mnn[j+(1<<(i-1))][i-1]);
		} 
	}
	
	for(int i=1;i<=log(m);i++)
	{
		for(int j=1;j<=m-(1<<i)+1;j++)
		{
			Mbx[j][i]=max(Mbx[j][i-1],Mbx[j+(1<<(i-1))][i-1]);
			Mbn[j][i]=min(Mbn[j][i-1],Mbn[j+(1<<(i-1))][i-1]);
		} 
	}
	
	while(q--)
	{
		int l1,l2,r1,r2;
		cin>>l1>>r1>>l2>>r2;
		int la=log(r1-l1+1),lb=log(r2-l2+1),ans=-INF;
		int StMax=max(Max[l1][la],Max[r1-(1<<la)+1][la]);
		int StMin=min(Min[l1][la],Min[r1-(1<<la)+1][la]);
		int StMxx=max(Mxx[l1][la],Mxx[r1-(1<<la)+1][la]);
		int StMnn=min(Mnn[l1][la],Mnn[r1-(1<<la)+1][la]);
		
		int StMbx=max(Mbx[l2][lb],Mbx[r2-(1<<lb)+1][lb]);
		int StMbn=min(Mbn[l2][lb],Mbn[r2-(1<<lb)+1][lb]);
		
		ans=max(ans,StMax*(StMax>=0?StMbn:StMbx));
		ans=max(ans,StMin*(StMin>=0?StMbn:StMbx));
		ans=max(ans,StMxx*(StMxx>=0?StMbn:StMbx));
		ans=max(ans,StMnn*(StMnn>=0?StMbn:StMbx));
		cout<<ans<<"\n";
	}
	return 0;
}

谢谢

2023/7/19 11:44
加载中...