社区讨论

st表0pts求调

P8818[CSP-S 2022] 策略游戏参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@loy5pwmr
此快照首次捕获于
2023/11/14 17:54
2 年前
此快照最后确认于
2023/11/14 19:48
2 年前
查看原帖
CPP
#include<iostream>
#include<cstdio>
using namespace std;
long long mx=999999999999,nx=-999999999999;
int n,m,q;
int l1,r1,l2,r2;
long long a,b;
long long maxx[100010][50],minn[100010][50],z[100010][50],f[100010][50];
//用于存储a数组的最大,最小,正区间最小,负区间最大 
long long b1[100010][50],b2[100010][50];
//用于存储b数组的最大值和最小值 
long long lg1[100010]={-1},lg2[100010]={-1};
//倍增 
int main(){
	//freopen("1.in","r",stdin);
	//freopen("1.out","w",stdout);
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a);
		lg1[i]=lg1[i/2]+1;
		maxx[i][0]=a;
		minn[i][0]=a;
		if(a>=0)z[i][0]=a;
		else z[i][0]=mx;
		if(a<0)f[i][0]=a;
		else f[i][0]=nx;
	}
	for(int i=1;i<=m;i++){
		scanf("%lld",&b);
		lg2[i]=lg2[i/2]+1;
		b1[i][0]=b;
		b2[i][0]=b;
	}//输入,预处理 
	for(int i=1;i<=lg1[n];i++){
		for(int j=1;j+(1<<i)-1<=n;j++){
			int p=j+(1<<(i-1));
			maxx[j][i]=max(maxx[j][i-1],maxx[p][i-1]);
		    minn[j][i]=min(minn[j][i-1],minn[p][i-1]);
		    z[j][i]=min(z[j][i-1],z[p][i-1]);
		    f[j][i]=max(f[j][i-1],f[p][i-1]);
		}
	}
	for(int i=1;i<=lg2[m];i++){
		for(int j=1;j+(1<<i)-1<=n;j++){
			int p=j+(1<<(i-1));
		    b1[j][i]=max(b1[j][i-1],b1[p][i-1]);
		    b2[j][i]=min(b2[j][i-1],b2[p][i-1]);
		}
	}//a和b的st表预处理 
	//最后求值 
	long long maxa,maxb;
    //a和b的选值
    long long zz1,zz2,zz3,zz4,zz;
    //四种情况 
    int len1,len2,p1,p2;
	for(int i=1;i<=q;i++){
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		len1=lg1[r1-l1+1];len2=lg2[r2-l2+1];
		p1=r1-(1<<len1)+1;p2=r2-(1<<len2)+1;
		
		maxb=min(b2[l2][len2],b2[p2][len2]);
		maxa=max(maxx[l1][len1],maxx[p1][len1]);
		zz1=maxa*maxb;
		maxa=min(z[l1][len1],z[p1][len1]);
		zz2=maxa*maxb;
	    if(maxa==999999999999)zz2=-maxa;
	    maxb=max(b1[l2][len2],b1[p2][len2]);
		maxa=min(minn[l1][len1],minn[p1][len1]);
		zz3=maxa*maxb;
		maxa=max(f[l1][len1],f[p1][len1]);
	    zz4=maxa*maxb;
	    if(maxa==-999999999999)zz4=maxa;
	    
	    zz=max(max(zz1,zz2),max(zz3,zz4));
	    printf("%lld\n",zz);
	}
	return 0;
}
样例12都过了

回复

0 条回复,欢迎继续交流。

正在加载回复...