社区讨论

刚学ST表RE求条

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

讨论操作

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

当前回复
14 条
当前快照
1 份
快照标识符
@mhjh01bp
此快照首次捕获于
2025/11/04 02:25
4 个月前
此快照最后确认于
2025/11/04 06:17
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];
int maxx[100005][32],minn[100005][32];
int a[100005],b[100005];
int fmax(int aa,int bb){
	if(aa<0&&bb<0) return max(aa,bb);
	else if(aa>0&&bb>0) return min(aa,bb);
	else if(aa<0&&bb<0) return bb;
	else return aa;
}
int zmin(int aa,int bb){
	if(aa>0&&bb>0) return min(aa,bb);
	else if(aa<0&&bb<0) return max(aa,bb);
	else if(aa>0&&bb<0) return aa;
	else return bb;
}
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]=zmin(minz[l][len-1],minz[l+(1<<len-1)][len-1]);
			maxf[l][len]=fmax(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)<=n;len++){
		for(int l=1;l+(1<<len)<=n;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 max(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 l2,int r1,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];
		maxz[i][0]=minz[i][0]=maxf[i][0]=minf[i][0]=maxx[i][0]=minn[i][0]=a[i];
	}
		
	for(int i=1;i<=m;i++)
		cin>>b[i];
	while(q--){
		int l1,l2,r1,r2;
		cin>>l1>>r1>>l2>>r2;
		cout<<work(l1,r1,l2,r2)<<endl;
	}
	return 0;
} 
用了6个st表,马峰不好,请大佬耐心观看
必关

回复

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

正在加载回复...