ST表 65pts求调
查看原帖
ST表 65pts求调
818730
yingshi1119楼主2024/9/27 23:23

rt

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const long long inf=1e18;
int n,m,q;
long long a[N],b[N];
long long sta1[N][23],sta2[N][23],sta3[N][23],sta4[N][23];//最小正,最大,最大负,最小 
long long stb1[N][23],stb2[N][23],stb3[N][23],stb4[N][23];//最小正,最大,最大负,最小 
void init()
{
	for(int i=1;i<=n;i++)
	{
		sta2[i][0]=sta4[i][0]=a[i];
		sta1[i][0]=(a[i]<0?inf:a[i]);
		sta3[i][0]=(a[i]>0?-inf:a[i]);
	}
	for(int i=1;i<=m;i++)
	{
		stb2[i][0]=stb4[i][0]=b[i];
		stb1[i][0]=(b[i]<0?inf:b[i]);
		stb3[i][0]=(b[i]>0?-inf:b[i]);
	}
	for(int i=1;(1<<i)<=n;i++)
	{
		for(int j=1;j+(1<<i)<=n+1;j++)
		{
			sta2[j][i]=max(sta2[j][i-1],sta2[j+(1<<(i-1))][i-1]);
			sta3[j][i]=max(sta3[j][i-1],sta3[j+(1<<(i-1))][i-1]);
		}
	}
	for(int i=1;(1<<i)<=n;i++)
	{
		for(int j=1;j+(1<<i)<=n+1;j++)
		{
			sta1[j][i]=min(sta1[j][i-1],sta1[j+(1<<(i-1))][i-1]);
			sta4[j][i]=min(sta4[j][i-1],sta4[j+(1<<(i-1))][i-1]);
		}
	}
	for(int i=1;(1<<i)<=m;i++)
	{
		for(int j=1;j+(1<<i)<=m+1;j++)
		{
			stb2[j][i]=max(stb2[j][i-1],stb2[j+(1<<(i-1))][i-1]);
			stb3[j][i]=max(stb3[j][i-1],stb3[j+(1<<(i-1))][i-1]);
		}
	}
	for(int i=1;(1<<i)<=m;i++)
	{
		for(int j=1;j+(1<<i)<=m+1;j++)
		{
			stb1[j][i]=min(stb1[j][i-1],stb1[j+(1<<(i-1))][i-1]);
			stb4[j][i]=min(stb4[j][i-1],stb4[j+(1<<(i-1))][i-1]);
		}
	}
	return;
}
long long minua(int l,int r)
{
	int k=log2(r-l+1);
	return min(sta1[l][k],sta1[r-(1<<k)+1][k]);
}
long long minda(int l,int r)
{
	int k=log2(r-l+1);
	return min(sta4[l][k],sta4[r-(1<<k)+1][k]);
}
long long maxua(int l,int r)
{
	int k=log2(r-l+1);
	return max(sta2[l][k],sta2[r-(1<<k)+1][k]);
}
long long maxda(int l,int r)
{
	int k=log2(r-l+1);
	return max(sta3[l][k],sta3[r-(1<<k)+1][k]);
}
long long minub(int l,int r)
{
	int k=log2(r-l+1);
	return min(stb1[l][k],stb1[r-(1<<k)+1][k]);
}
long long mindb(int l,int r)
{
	int k=log2(r-l+1);
	return min(stb4[l][k],stb4[r-(1<<k)+1][k]);
}
long long maxub(int l,int r)
{
	int k=log2(r-l+1);
	return max(stb2[l][k],stb2[r-(1<<k)+1][k]);
}
long long maxdb(int l,int r)
{
	int k=log2(r-l+1);
	return max(stb3[l][k],stb3[r-(1<<k)+1][k]);
}
int main()
{
	//freopen("P8818_4.in","r",stdin);
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	for(int i=1;i<=m;i++)
	{
		cin>>b[i];
	}
	init();
	for(int i=1;i<=q;i++)
	{
		int l1,l2,r1,r2;//A有正有负 B负 C正 
		cin>>l1>>r1>>l2>>r2;
		if(maxua(l1,r1)>=0&&maxub(l2,r2)>=0&&minda(l1,r1)<=0&&mindb(l2,r2)<=0)
		{
			cout<<max(minua(l1,r1)*mindb(l2,r2),maxda(l1,r1)*maxub(l2,r2))<<endl;
			//cout<<minua(l1,r1)<<" "<<mindb(l2,r2)<<" "<<maxda(l1,r1)<<" "<<maxub(l2,r2)<<endl;
		}//ab AA
		else if(maxua(l1,r1)>=0&&minda(l1,r1)<=0&&maxub(l2,r2)<=0)// AB
		{
			cout<<minda(l1,r1)*maxdb(l2,r2)<<endl;
		}
		else if(maxua(l1,r1)>=0&&minda(l1,r1)<=0&&mindb(l2,r2)>=0)//AC
		{
			cout<<maxua(l1,r1)*minub(l2,r2)<<endl;
			//cout<<maxua(l1,r1)<<" "<<minub(l2,r2)<<endl; 
		}
		else if(maxua(l1,r1)<=0&&minda(l1,r1)<=0&&mindb(l2,r2)<=0)//BA
		{
			cout<<minda(l1,r1)*maxub(l2,r2)<<endl;
		}
		else if(minda(l1,r1)>=0&&minda(l1,r1)<=0&&mindb(l2,r2)<=0)//CA
		{
			cout<<minua(l1,r1)*mindb(l2,r2)<<endl;
		}
		else if(maxua(l1,r1)<=0&&maxub(l2,r2)<=0)//BB
		{
			cout<<minda(l1,r1)*maxdb(l2,r2)<<endl;
		}
		else if(minda(l1,r1)>=0&&mindb(l2,r2)>=0)//CC
		{
			cout<<maxua(l1,r1)*minub(l2,r2)<<endl;
		}
		else if(maxua(l1,r1)<=0&&mindb(l2,r2)>=0)//BC
		{
			cout<<maxda(l1,r1)*maxub(l2,r2)<<endl;
		}
		else//CB
		{
			cout<<minua(l1,r1)*mindb(l2,r2)<<endl;
		} 
	}
	return 0;
}
2024/9/27 23:23
加载中...