社区讨论

爆零,求条

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mhjgzep3
此快照首次捕获于
2025/11/04 02:24
4 个月前
此快照最后确认于
2025/11/04 02:24
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,q;
int maxz[100005][32],minz[100005][32],maxf[100005][32],minf[100005][32];//A数组正数最大,正数最小,负数最大,负数最小
int maxx[100005][32],minn[100005][32];//B数组最大最小
int a[100005],b[100005];
void inita(){
	for(int len=1;(1<<len)<=n;len++){
		for(int l=1;l+(1<<len)<=n;l++){
			maxz[l][len]=max(maxz[l][len-1],maxz[l+(1<<len-1)][len-1]);
			minz[l][len]=min(minz[l][len-1],minz[l+(1<<len-1)][len-1]);
			maxf[l][len]=max(maxf[l][len-1],maxf[l+(1<<len-1)][len-1]);
			minf[l][len]=min(minf[l][len-1],minf[l+(1<<len-1)][len-1]);
		}
	}
}
void initb(){
	for(int len=1;(1<<len)<=m;len++){
		for(int l=1;l+(1<<len)<=m;l++){
			maxx[l][len]=max(maxx[l][len-1],maxx[l+(1<<len-1)][len-1]);
			minn[l][len]=min(minn[l][len-1],minn[l+(1<<len-1)][len-1]);
		}
	}
}
int q1(int l,int r){
	int k=log2(r-l+1);
	return max(maxz[l][k],maxz[r-(1<<k)+1][k]);
}
int q2(int l,int r){
	int k=log2(r-l+1);
	return min(minz[l][k],minz[r-(1<<k)+1][k]); 
}
int q3(int l,int r){
	int k=log2(r-l+1);
	return max(maxf[l][k],maxf[r-(1<<k)+1][k]);
}
int q4(int l,int r){
	int k=log2(r-l+1);
	return min(minf[l][k],minf[r-(1<<k)+1][k]);
}
int q5(int l,int r){
	int k=log2(r-l+1);
	return max(maxx[l][k],maxx[r-(1<<k)+1][k]);
}
int q6(int l,int r){
	int k=log2(r-l+1);
	return min(minn[l][k],minn[r-(1<<k)+1][k]);
}
int work(int l1,int r1,int l2,int r2){
	int a=q1(l1,r1)*q6(l2,r2);
	int b=q2(l1,r1)*q6(l2,r2);
	int c=q3(l1,r1)*q5(l2,r2);
	int d=q4(l1,r1)*q5(l2,r2);
	return max({a,b,c,d});
}
int main(){
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
        if(a[i]>0) {maxz[i][0]=minz[i][0]=a[i];maxf[i][0]=-1e9;minf[i][0]=a[i];}
        else if(a[i]<0) {maxf[i][0]=minf[i][0]=a[i];maxz[i][0]=a[i];minz[i][0]=1e9;}
		else maxz[i][0]=minz[i][0]=maxf[i][0]=minf[i][0]=a[i];
	}
	for(int i=1;i<=m;i++){
		cin>>b[i];
        maxx[i][0]=minn[i][0]=b[i];
    }
	while(q--){
		int l1,l2,r1,r2;
		cin>>l1>>r1>>l2>>r2;
		cout<<work(l1,r1,l2,r2)<<endl;
	}
	return 0;
} 


马蜂不好,见谅

回复

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

正在加载回复...