社区讨论

0分求调

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@ltsg17v1
此快照首次捕获于
2024/03/15 17:15
2 年前
此快照最后确认于
2024/03/15 19:38
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N= 100000+100;
int st1[N][21],st2[N][21],st3[N][21],st4[N][21],st5[N][21],st6[N][21];
int n,m,q;
void st(int num)
{
	/*if(num==1){
		#define f st1
	}
	else if(num==2){
		#define f st2
	}
	else if(num==3){
		#define f st3
	}
	else if(num==4){
		#define f st4
	}
	else if(num==5){
		#define f st5
	}
	else{
		#define f st6
	}*/
	for(int j=1;(1<<j)<=n;j++){
		if(num==1){
			for(int i=1;i<=n-(1<<j)+1;i++){
					st1[i][j]=max(st1[i][j-1],st1[i+(1<<(j-1))][j-1]);
			}
			break;
		}
		else if(num==2){
			for(int i=1;i<=n-(1<<j)+1;i++){
					st2[i][j]=min(st2[i][j-1],st2[i+(1<<(j-1))][j-1]);
			}
			break;	
		}
		else if(num==3){
			for(int i=1;i<=m-(1<<j)+1;i++){
					st3[i][j]=max(st3[i][j-1],st3[i+(1<<(j-1))][j-1]);
			}
			break;
		}
		else if(num==4){
			for(int i=1;i<=m-(1<<j)+1;i++){
					st4[i][j]=min(st4[i][j-1],st4[i+(1<<(j-1))][j-1]);
			}
			break;		
		}
		else if(num==5){
			for(int i=1;i<=n-(1<<j)+1;i++){
					st5[i][j]=min(st5[i][j-1],st5[i+(1<<(j-1))][j-1]);
			}
			break;
		}
		else if(num==6){
			for(int i=1;i<=n-(1<<j)+1;i++){
					st6[i][j]=max(st6[i][j-1],st6[i+(1<<(j-1))][j-1]);
			}
			break;
		}
	}
}
signed main()
{
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n;i++){
		int x;
		scanf("%d",&x);
		st2[i][0]=st1[i][0]=x;
	}
	for(int i=1;i<=m;i++){
		int x;
		scanf("%d",&x);
		st4[i][0]=st3[i][0]=x;
	}
	for(int i=1;i<=n;i++){
		if(st1[i][0]>=0) st5[i][0]=st1[i][0];
		else st5[i][0]=1e18;
	}
	for(int i=1;i<=n;i++){
		if(st1[i][0]<=0) st6[i][0]=st1[i][0];
		else st6[i][0]=LONG_LONG_MIN;
	}
	for(int i=1;i<=6;i++){
		st(i);
	}
	while(q--)
	{
		int l1,l2,r1,r2,ans=LONG_LONG_MIN;
		scanf("%d %d %d %d",&l1,&l2,&r1,&r2);
		int k=log2(r1-l1+1);
		int op=log2(r2-l2+1);
		int maxn=max(st3[l2][op],st3[r2-(1<<op)+1][op]);
		int minn=min(st4[l2][op],st4[r2-(1<<op)+1][op]);
		
		int x=max(st1[l1][k],st1[r1-(1<<k)+1][k]);
		if(x>=0) ans=max(ans,minn*x);
		else ans=max(ans,maxn*x);
		
		x=min(st2[l1][k],st2[r1-(1<<k)+1][k]);
		if(x>=0) ans=max(ans,minn*x);
		else ans=max(ans,maxn*x);
		
		x=min(st5[l1][k],st5[r1-(1<<k)+1][k]);
		if(x>=0) ans=max(ans,minn*x);
		else ans=max(ans,maxn*x);
		
		x=max(st6[l1][k],st6[r1-(1<<k)+1][k]);
		if(x>=0) ans=max(ans,minn*x);
		else ans=max(ans,maxn*x);
		printf("%d\n",ans);
	}
	return 0;
}

回复

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

正在加载回复...