WA45分求调
查看原帖
WA45分求调
578251
craft_07楼主2023/10/2 19:35

八个st表,大测试点全WA了,写了两个晚上了

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>

using namespace std;

typedef long long LL;
const LL MAX=1e18;
const LL MIN=-MAX;

//ÓÎÏ· 
int n,m,q;
LL L[100003],Q[100003];
void read(); 
//st±í
int logn[1000003];
LL mx_all_L[100003][19]; LL search1(int,int);
LL mn_all_L[100003][19]; LL search2(int,int);
LL mx_ne_L [100003][19]; LL search3(int,int);
LL mn_po_L [100003][19]; LL search4(int,int);
LL mx_all_Q[100003][19]; LL search5(int,int);
LL mn_all_Q[100003][19]; LL search6(int,int);
LL mx_ne_Q [100003][19]; LL search7(int,int);
LL mn_po_Q [100003][19]; LL search8(int,int);
void lg();
void init();
//ÇóÖµ
LL find(int,int,int,int); 

int main() {
	lg();
	read();
	init();
	while(q--){
		int l1,r1,l2,r2;
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
//		printf("%lld ",search1(l1,r1));
//		printf("%lld ",search2(l1,r1));
//		printf("%lld ",search3(l1,r1));
//		printf("%lld ",search4(l1,r1));
//		printf("%lld ",search5(l2,r2));
//		printf("%lld ",search6(l2,r2));
//		printf("%lld ",search7(l2,r2));
//		printf("%lld\n",search8(l2,r2));
		LL ans = find(l1,r1,l2,r2);
		printf("%lld\n",ans);
	}
	return 0;
}

//¶ÁÈë
void read(){
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n;i++)
	  scanf("%lld",&L[i]);
	for(int i=1;i<=m;i++)
	  scanf("%lld",&Q[i]);
} 

//st±í
void lg(){
	logn[1]=0,logn[2]=1;
	for(int i=3;i<1000003;i++)
	  logn[i]=logn[i/2]+1;
} 

void init() {
	//¸³³õÖµ 
	for(int i=1;i<=n;i++) {
		mx_all_L[i][0] = L[i];
		mn_all_L[i][0] = L[i];
		mx_ne_L [i][0] = L[i]<=0 ? L[i] : MIN;
		mn_po_L [i][0] = L[i]>0  ? L[i] : MAX;
	}
	for(int i=1;i<=m;i++) {
		mx_all_Q[i][0] = Q[i];
		mn_all_Q[i][0] = Q[i];
		mx_ne_Q [i][0] = Q[i]<=0 ? Q[i] : MIN;
		mn_po_Q [i][0] = Q[i]>0  ? Q[i] : MAX;
	}
	
	//³õʼ»¯
	for(int j=1;(1<<j)<=n;j++)
	  for(int i=1;i+(1<<j)-1<=n;i++) {
	  	mx_all_L[i][j] = max( mx_all_L[i][j-1] , mx_all_L[i+(1<<(j-1))][j-1] ); 
	  	mn_all_L[i][j] = min( mn_all_L[i][j-1] , mn_all_L[i+(1<<(j-1))][j-1] ); 
	  	mx_ne_L [i][j] = max( mx_ne_L [i][j-1] , mx_ne_L [i+(1<<(j-1))][j-1] ); 
	  	mn_po_L [i][j] = min( mn_po_L [i][j-1] , mn_po_L [i+(1<<(j-1))][j-1] ); 
	  } 
	for(int j=1;(1<<j)<=m;j++)
	  for(int i=1;i+(1<<j)-1<=m;i++) {
	  	mx_all_Q[i][j] = max( mx_all_Q[i][j-1] , mx_all_Q[i+(1<<(j-1))][j-1] ); 
	  	mn_all_Q[i][j] = min( mn_all_Q[i][j-1] , mn_all_Q[i+(1<<(j-1))][j-1] ); 
	  	mx_ne_Q [i][j] = max( mx_ne_Q [i][j-1] , mx_ne_Q [i+(1<<(j-1))][j-1] ); 
	  	mn_po_Q [i][j] = min( mn_po_Q [i][j-1] , mn_po_Q [i+(1<<(j-1))][j-1] ); 
	  } 
}


LL search1 (int x , int y) {
	int k=logn[y-x+1];
	return max ( mx_all_L[x][k] ,
							mx_all_L[y-(1<<k)+1][k] );
} LL search2 (int x , int y) {
	int k=logn[y-x+1];
	return min ( mn_all_L[x][k] ,
							mn_all_L[y-(1<<k)+1][k] );
} LL search3 (int x , int y) {
	int k=logn[y-x+1];
	return max ( mx_ne_L [x][k] ,
							mx_ne_L [y-(1<<k)+1][k] );
} LL search4 (int x , int y) {
	int k=logn[y-x+1];
	return min ( mn_po_L [x][k] ,
							mn_po_L [y-(1<<k)+1][k] );
} LL search5 (int x , int y) {
	int k=logn[y-x+1];
	return max ( mx_all_Q[x][k] ,
							mx_all_Q[y-(1<<k)+1][k] );
} LL search6 (int x , int y) {
	int k=logn[y-x+1];
	return min ( mn_all_Q[x][k] ,
							mn_all_Q[y-(1<<k)+1][k] );
} LL search7 (int x , int y) {
	int k=logn[y-x+1];
	return max ( mx_ne_Q[x][k] ,
							mx_ne_Q [y-(1<<k)+1][k] );
} LL search8 (int x , int y) {
	int k=logn[y-x+1];
	return min ( mn_po_Q[x][k] ,
							mn_po_Q [y-(1<<k)+1][k] );
} 

//´ð°¸ 
LL find(int l1,int r1,int l2,int r2){
	//¶¨Òå±äÁ¿ 
//	puts("@ ");
	LL max_all_L = search1 (l1,r1) ;
	LL min_all_L = search2 (l1,r1) ;
	LL max_ne_L  = search3 (l1,r1) ;
	LL min_po_L  = search4 (l1,r1) ;
	LL max_all_Q = search5 (l2,r2) ;
	LL min_all_Q = search6 (l2,r2) ;
	LL max_ne_Q  = search7 (l2,r2) ;
	LL min_po_Q  = search8 (l2,r2) ;
	
	bool Q_po = (max_all_Q >  0) ;
	bool Q_ne = (min_all_Q <= 0) ;
	bool L_po = (max_all_L >  0) ;
	bool L_ze = (max_ne_L  == 0) ;
	bool L_ne = (min_all_L <= 0) ;
//	printf("%lld %lld %lld %lld %lld %lld %lld %lld \n",max_all_L,min_all_L,max_ne_L,min_po_L,max_all_Q,min_all_Q,max_ne_Q,min_po_Q);
//	printf("%d %d %d %d %d \n",Q_po,Q_ne,L_po,L_ze,L_ne);
	//¼ÆËã
	LL ans=MIN;
//	printf("%lld\n",ans);
	
	if ( Q_po and !Q_ne ) {
		if ( L_po ) {
//			puts("A");
			ans = max_all_L *  min_po_Q ;
		} else if( L_ze ) {
//			puts("B");
		  	ans = 0 ;
		} else if( L_po ){
//			puts("C");
			ans = max_ne_L  * max_all_Q ;
		}
	} else if( !Q_po and Q_ne ) {
		if ( L_ne ) {
//			puts("D");
			ans = min_all_L *  max_ne_Q ;
		} else if ( L_ze ) {
//			puts("E");
			ans = 0 ;
		} else if ( L_po ) {
//			puts("F");
			ans = min_po_L  * min_all_Q ;
		}
	} else if( Q_po and Q_ne ) {
		if ( L_ze ) {
//			puts("G");
			ans = 0 ;
		} else {
			if( L_po ){
//			puts("H");
//	printf("%lld\n",ans);
				ans = max ( ans , min_po_L * min_all_Q ) ;
			} 
			if( L_ne ){
//			puts("I");
//	printf("%lld\n",ans);
//	printf("%lld %lld\n",max_ne_L,max_all_Q);
				ans = max ( ans , max_ne_L * max_all_Q ) ;
			}
		}
	}
//	printf("%lld\n",ans);
	return ans;
}
2023/10/2 19:35
加载中...