社区讨论

85pts!玄关求条

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mdcut7y3
此快照首次捕获于
2025/07/21 16:38
8 个月前
此快照最后确认于
2025/11/04 03:59
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
#define inf (int)(1e14)
using namespace std;
int n,m,q;
int a[100086];
int b[100086];
int f[10][100086][30];
int al,ar,bl,br;
int ak,bk;
int amx,amn,bmx,bmn,_amx,_amn,_bmx,_bmn,a_0,b_0;
int read(){
	int 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*10+ch-48;ch=getchar();}
	return x*f;
}
signed main(){
//	freopen("a.txt","r",stdin);
	n=read();m=read();q=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	for(int i=1;i<=m;i++){
		b[i]=read();
	}
	for(int i=1;i<=n;i++){
		f[0][i][0]=f[3][i][0]=a[i];
		f[1][i][0]=(a[i]>=0?a[i]:LLONG_MAX);
		f[2][i][0]=(a[i]<0?a[i]:LLONG_MIN);
		if(a[i]==0)f[4][i][0]=1;
	}
	for(int i=1;i<=m;i++){
		f[5][i][0]=f[8][i][0]=b[i];
		f[6][i][0]=(b[i]>=0?b[i]:LLONG_MAX);
		f[7][i][0]=(b[i]<0?b[i]:LLONG_MIN);
		if(b[i]==0)f[9][i][0]=1;
	}
	for(int j=1;j<=log2(n);j++){
		for(int i=1;i<=n;i++){
			if(i+(1<<(j-1))<=n){
				f[0][i][j]=max(f[0][i][j-1],f[0][i+(1<<(j-1))][j-1]);
				f[1][i][j]=min(f[1][i][j-1],f[1][i+(1<<(j-1))][j-1]);
				f[2][i][j]=max(f[2][i][j-1],f[2][i+(1<<(j-1))][j-1]);
				f[3][i][j]=min(f[3][i][j-1],f[3][i+(1<<(j-1))][j-1]);
				f[4][i][j]=max(f[4][i][j-1],f[4][i+(1<<(j-1))][j-1]);
			}
		}
	}
	for(int j=1;j<=log2(n);j++){
		for(int i=1;i<=m;i++){
			if(i+(1<<(j-1))<=m){
				f[5][i][j]=max(f[5][i][j-1],f[5][i+(1<<(j-1))][j-1]);
				f[6][i][j]=min(f[6][i][j-1],f[6][i+(1<<(j-1))][j-1]);
				f[7][i][j]=max(f[7][i][j-1],f[7][i+(1<<(j-1))][j-1]);
				f[8][i][j]=min(f[8][i][j-1],f[8][i+(1<<(j-1))][j-1]);
				f[9][i][j]=max(f[9][i][j-1],f[9][i+(1<<(j-1))][j-1]);
			}
		}
	}
	while(q--){
		cin>>al>>ar>>bl>>br;
		ak=log2(ar-al+1),bk=log2(br-bl+1);
		amx=max(f[0][al][ak],f[0][ar-(1<<ak)+1][ak]);
		amn=min(f[1][al][ak],f[1][ar-(1<<ak)+1][ak]);
		_amx=max(f[2][al][ak],f[2][ar-(1<<ak)+1][ak]);
		_amn=min(f[3][al][ak],f[3][ar-(1<<ak)+1][ak]);
		a_0=max(f[4][al][ak],f[4][ar-(1<<ak)+1][ak]);
		bmx=max(f[5][bl][bk],f[5][br-(1<<bk)+1][bk]);
		bmn=min(f[6][bl][bk],f[6][br-(1<<bk)+1][bk]);
		_bmx=max(f[7][bl][bk],f[7][br-(1<<bk)+1][bk]);
		_bmn=min(f[8][bl][bk],f[8][br-(1<<bk)+1][bk]);
		b_0=max(f[9][bl][bk],f[9][br-(1<<bk)+1][bk]);
		int ans;
		if(_amn>=0){
			if(_bmn>=0){
				ans=amx*_bmn;
			}
			else if(bmx<0){
				ans=_amn*_bmn;
			}
			else{
				ans=_amn*_bmn;
			}
		}
		else if(amx<0){
			if(_bmn>=0){
				ans=amx*bmx;
			}
			else if(bmx<0){
				ans=_amn*bmx;
			}
			else{
				ans=amx*bmx;
			}
		}
		else{
			if(_bmn>=0){
				ans=amx*_bmn;
			}
			else if(bmx<0){
				ans=_amn*bmx;
			}
			else{
				ans=max(_amx*bmx,amn*_bmn);
			}
		}
		if(a_0)ans=max(ans,0ll);
		if(b_0)ans=min(0ll,ans);
		cout<<ans<<endl;
	}
	return 0;
}

回复

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

正在加载回复...