求调6 ST表
查看原帖
求调6 ST表
242317
xiaofu15191楼主2022/12/5 21:32
#include<cstdio>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;
long long min(long long t1,long long t2)
{
	if(t1<t2) return t1;
	else return t2;
}
long long max(long long t1,long long t2)
{
	if(t1>t2) return t1;
	else return t2;
}
long long a[100001],b[100001],n,m,q,log[100001];
//long long tree1[100001],tree2[100001],tree3[100001],tree4[100001],tree5[100001],tree6[100001];
//tree1 is max(a),tree2 is min(a>=0),tree3 is max(a<0),tree4 is min(a),tree5 is min(b),tree6 is max(b)
struct ST_Table
{
	long long num[100001][20],i;
	inline long long cmp(long long t)
	{
		if(i==2&&t<0) return INF;
		else if(i==3&&t>=0) return -INF;
		else return t;
	}
	void build1(char t)
	{
		if(t=='a')
		{
			for(long long i=1;i<=n;i++)
				num[i][0]=cmp(a[i]);
			for(long long i=1;i<=log[n];i++)
				for(long long j=1;j+(1<<i)-1<=n;j++)
					num[j][i]=max(num[j][i-1],num[j+(1<<(i-1))][i-1]);
		}
		else
		{
			for(long long i=1;i<=m;i++)
				num[i][0]=cmp(b[i]);
			for(long long i=1;i<=log[m];i++)
				for(long long j=1;j+(1<<i)-1<=m;j++)
					num[j][i]=max(num[j][i-1],num[j+(1<<(i-1))][i-1]);
		}
	}
	long long get1(long long l,long long r)
	{
		long long t=log[r-l+1];
		return max(num[l][t],num[r-(1<<t)+1][t]);
	}
	void build2(char t)
	{
		if(t=='a')
		{
			for(long long i=1;i<=n;i++)
				num[i][0]=cmp(a[i]);
			for(long long i=1;i<=log[n];i++)
				for(long long j=1;j+(1<<i)-1<=n;j++)
					num[j][i]=min(num[j][i-1],num[j+(1<<(i-1))][i-1]);
		}
		else
		{
			for(long long i=1;i<=m;i++)
				num[i][0]=cmp(b[i]);
			for(long long i=1;i<=log[m];i++)
				for(long long j=1;j+(1<<i)-1<=m;j++)
					num[j][i]=min(num[j][i-1],num[j+(1<<(i-1))][i-1]);
		}
	}
	long long get2(long long l,long long r)
	{
		long long t=log[r-l+1];
		return min(num[l][t],num[r-(1<<t)+1][t]);
	}
};
ST_Table st1,st2,st3,st4,st5,st6;
int main()
{
 	freopen("game.in","r",stdin);
 	freopen("game.out","w",stdout);
	st1.i=1;
	st2.i=2;
	st3.i=3;
	st4.i=4;
	st5.i=5;
	st6.i=6;
	scanf("%lld%lld%lld",&n,&m,&q);
	for(long long i=2;i<=n;i++)
		log[i]=log[i/2]+1;
	for(long long i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	for(long long i=1;i<=m;i++)
		scanf("%lld",&b[i]);
	st1.build1('a');
	st2.build2('a');
	st3.build1('a');
	st4.build2('a');
	st5.build2('b');
	st6.build1('b');
	for(long long i=1;i<=q;i++)
	{
		long long l1,r1,l2,r2;
		scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2);
		long long ans=-9223372036854775807;
		ans=max(ans,st1.get1(l1,r1)*st5.get2(l2,r2));
		ans=max(ans,st2.get2(l1,r1)*st5.get2(l2,r2));
		ans=max(ans,st3.get1(l1,r1)*st6.get1(l2,r2));
		ans=max(ans,st4.get2(l1,r1)*st6.get1(l2,r2));
		printf("%lld\n",ans);
	}
	/*build1(1,1,n);
	build2(1,1,n);
	build3(1,1,n);
	build4(1,1,n);
	build5(1,1,n);
	build6(1,1,n);
	for(long long i=1;i<=q;i++)
	{
		long long l1,r1,l2,r2;
		scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2);
		long long ans=-9223372036854775807;
		ans=max(ans,get1(1,1,n,l1,r1)*get5(1,1,n,l2,r2));
		ans=max(ans,get2(1,1,n,l1,r1)*get5(1,1,n,l2,r2));
		ans=max(ans,get3(1,1,n,l1,r1)*get6(1,1,n,l2,r2));
		ans=max(ans,get4(1,1,n,l1,r1)*get6(1,1,n,l2,r2));
		prlong longf("%lld\n",ans);
	}*/
}
2022/12/5 21:32
加载中...