S组T2惨遭爆零,能帮忙查一下错吗?谢谢
  • 板块学术版
  • 楼主houmy
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/11/13 11:12
  • 上次更新2023/10/27 03:08:28
查看原帖
S组T2惨遭爆零,能帮忙查一下错吗?谢谢
555809
houmy楼主2022/11/13 11:12
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,q;
ll a[100005],b[100005],l1,r1,l2,r2;
ll st_a_min[100005][17],st_a_max[100005][17],st_b_min[100005][17],st_b_max[100005][17],st_a_neg_max[100005][17],st_a_pos_min[100005][17];
ll lg_2[100005];
int main(){
	freopen("game/game1.in","r",stdin);
	freopen("game/game1.out","w",stdout);
	lg_2[1]=0;
	for(int i=2;i<=100000;i++)lg_2[i]=lg_2[i>>1]+1;
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++){cin>>a[i];st_a_max[i][0]=st_a_min[i][0]=a[i];}
    for(int i=1;i<=lg_2[n];i++)for(int j=1;j+(1<<i)-1<=n;j++){
        st_a_max[j][i]=max(st_a_max[j][i>>1],st_a_max[j+(1<<(i-1))][i>>1]);
        st_a_min[j][i]=min(st_a_min[j][i>>1],st_a_min[j+(1<<(i-1))][i>>1]);
    }
    for(int i=1;i<=m;i++){cin>>b[i];st_b_max[i][0]=st_b_min[i][0]=b[i];}
    for(int i=1;i<=lg_2[m];i++)for(int j=1;j+(1<<i)-1<=m;j++){
        st_b_max[j][i]=max(st_b_max[j][i>>1],st_b_max[j+(1<<(i-1))][i>>1]);
        st_b_min[j][i]=min(st_b_min[j][i>>1],st_b_min[j+(1<<(i-1))][i>>1]);
    }
    for(int i=1;i<=n;i++){
		if(a[i]>=0)st_a_neg_max[i][0]=LLONG_MIN;
		else st_a_neg_max[i][0]=a[i];
		if(a[i]<0)st_a_pos_min[i][0]=LLONG_MAX;
		else st_a_pos_min[i][0]=a[i];
	}
	for(int i=1;i<=lg_2[n];i++)for(int j=1;j+(1<<i)-1<=n;j++){
        st_a_neg_max[j][i]=max(st_a_neg_max[j][i>>1],st_a_neg_max[j+(1<<(i-1))][i>>1]);
        st_a_pos_min[j][i]=min(st_a_pos_min[j][i>>1],st_a_pos_min[j+(1<<(i-1))][i>>1]);
    }
    while(q--){
    	cin>>l1>>r1>>l2>>r2;
    	ll min_a=min(st_a_min[l1][lg_2[r1-l1+1]],st_a_min[r1-(1<<lg_2[r1-l1+1])+1][lg_2[r1-l1+1]]);
    	ll max_a=max(st_a_max[l1][lg_2[r1-l1+1]],st_a_max[r1-(1<<lg_2[r1-l1+1])+1][lg_2[r1-l1+1]]);
    	ll min_b=min(st_b_min[l2][lg_2[r2-l2+1]],st_b_min[r2-(1<<lg_2[r2-l2+1])+1][lg_2[r2-l2+1]]);
    	ll max_b=max(st_b_max[l2][lg_2[r2-l2+1]],st_b_max[r2-(1<<lg_2[r2-l2+1])+1][lg_2[r2-l2+1]]);
    	ll min_pos_a=min(st_a_pos_min[l1][lg_2[r1-l1+1]],st_a_pos_min[r1-(1<<lg_2[r1-l1+1])+1][lg_2[r1-l1+1]]);
    	ll max_neg_a=max(st_a_neg_max[l1][lg_2[r1-l1+1]],st_a_neg_max[r1-(1<<lg_2[r1-l1+1])+1][lg_2[r1-l1+1]]);
    	ll ans=LLONG_MIN;
    	ans=max(ans,max_a*((max_a>=0)?min_b:max_b));
    	ans=max(ans,min_a*((min_a>=0)?min_b:max_b));
    	if(min_pos_a!=LLONG_MAX)ans=max(ans,min_pos_a*((min_pos_a>=0)?min_b:max_b));
		if(max_neg_a!=LLONG_MIN)ans=max(ans,max_neg_a*((max_neg_a>=0)?min_b:max_b));
		cout<<ans<<endl;
	}
}
2022/11/13 11:12
加载中...