-S T2 55分求调
  • 板块学术版
  • 楼主zyxawa
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/11/1 22:35
  • 上次更新2023/10/27 04:33:38
查看原帖
-S T2 55分求调
673294
zyxawa楼主2022/11/1 22:35
#include<bits/stdc++.h>
using namespace std;
inline long long read(){
    register long long x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
int n,m,q,lg[100001];
long long max_a[100001][21],min_a[100001][21],max_b[100001][21],min_b[100001][21],min_za[100001][21],max_fa[100001][21];
int main(){
	scanf("%d%d%d",&n,&m,&q);
	for(int i=2;i<=max(n,m);i++) lg[i]=lg[i/2]+1;
	for(int i=1;i<=n;i++){
		min_a[i][0]=max_a[i][0]=read();
		if(min_a[i][0]>=0) min_za[i][0]=min_a[i][0];
		else min_za[i][0]=1e16;
		if(min_a[i][0]<=0) max_fa[i][0]=min_a[i][0];
		else max_fa[i][0]=-1e16;
	}
	for(int i=1;i<=m;i++) min_b[i][0]=max_b[i][0]=read();
	for(int k=1;k<=lg[n];k++){
		for(int i=1;i+(1<<(k-1))<=n;i++){
			min_a[i][k]=min(min_a[i][k-1],min_a[i+(1<<(k-1))][k-1]);
			max_a[i][k]=max(max_a[i][k-1],max_a[i+(1<<(k-1))][k-1]);
			min_za[i][k]=min(min_za[i][k-1],min_za[i+(1<<(k-1))][k-1]);
			max_fa[i][k]=max(max_fa[i][k-1],max_fa[i+(1<<(k-1))][k-1]);
		}
	}
	for(int k=1;k<=lg[m];k++){
		for(int i=1;i+(1<<(k-1))<=m;i++){
			min_b[i][k]=min(min_b[i][k-1],min_b[i+(1<<(k-1))][k-1]);
			max_b[i][k]=max(max_b[i][k-1],max_b[i+(1<<(k-1))][k-1]);
		}
	}
	while(q--){
		int l1=(int)read(),r1=(int)read(),l2=(int)read(),r2=(int)read(),ka=lg[r1-l1+1],kb=lg[r2-l2+1];
		long long a_min=max(min_a[l1][ka],min_a[r1-(1<<ka)+1][ka]),a_max=max(max_a[l1][ka],max_a[r1-(1<<ka)+1][ka]),za_min=min(min_za[l1][ka],min_za[r1-(1<<ka)+1][ka]),fa_max=max(max_fa[l1][ka],max_fa[r1-(1<<ka)+1][ka]),b_min=min(min_b[l2][kb],min_b[r2-(1<<kb)+1][kb]),b_max=max(max_b[l2][kb],max_b[r2-(1<<kb)+1][kb]);
		if(a_min>=0){
			if(b_min>=0) printf("%lld\n",a_max*b_min);
			else if(b_max<=0) printf("%lld\n",za_min*b_min);
			else printf("%lld\n",za_min*b_min);
		}
		else if(a_max<=0){
			if(b_min>=0) printf("%lld\n",fa_max*b_max);
			else if(b_max<=0) printf("%lld\n",a_min*b_max);
			else printf("%lld\n",fa_max*b_max);
		}
		else{
			if(b_min>=0) printf("%lld\n",a_max*b_min);
			else if(b_max<=0) printf("%lld\n",a_min*b_max);
			else printf("%lld\n",max(za_min*b_min,fa_max*b_max));
		}
	}
	return 0;
}

st也许大概应该没有打错,顺便问一下CQ这次-S一等线大概多少啊

2022/11/1 22:35
加载中...