社区讨论

65pts 求调

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@lo10pxlj
此快照首次捕获于
2023/10/22 13:18
2 年前
此快照最后确认于
2023/11/02 12:47
2 年前
查看原帖
CPP
/*
	all.b>=0
	 	存在.a>=0  则小L选最大的正数;小Q选最小的正数(包括0);
	 	all.a<=0  则小L选最大的负数(包括0);小Q选最大的正数;
	all.b<=0
		存在.a<=0  则小L选最小的负数;小Q选最大的负数(包括0);
		all.a>=0 则小L选最小的正数(包括0);小Q选最小的负数;
	b∈R
		 L选最接近0的数(包括0)
			如果最接近0的数是一正一负 那么L选小Q中最远离0的数同号的数 
		 	L选a>=0 小Q选最小的负数
			L选a<=0 小Q选最大的正数 
*/
#include<bits/stdc++.h>
#define int long long
#define MAXN 1e10
using namespace std;
int n,m,q;
int a[100009],b[100009];
int sazmax[400009],sazmin[400009],safmax[400009],safmin[400009];
int sbzmax[400009],sbzmin[400009],sbfmax[400009],sbfmin[400009];
void build1(int k,int l,int r){
	if(l==r){
		if(a[l]>=0){
			sazmax[k]=a[l];
			sazmin[k]=a[l];
			safmax[k]=-MAXN;
			safmin[k]=1;
			return;
		}
		if(a[l]<=0){
			safmax[k]=a[l];
			safmin[k]=a[l];
			sazmax[k]=-1;
			sazmin[k]=MAXN;
			return;
		}
	}
	int mid=l+r>>1;
	build1(k<<1,l,mid);
	build1(k<<1|1,mid+1,r);
	sazmax[k]=max(sazmax[k<<1],sazmax[k<<1|1]);
	sazmin[k]=min(sazmin[k<<1],sazmin[k<<1|1]);
	safmax[k]=max(safmax[k<<1],safmax[k<<1|1]);
	safmin[k]=min(safmin[k<<1],safmin[k<<1|1]);
}
void build2(int k,int l,int r){
	if(l==r){
		if(b[l]>=0){
			sbzmax[k]=b[l];
			sbzmin[k]=b[l];
			sbfmax[k]=-MAXN;
			sbfmin[k]=1;
			return;
		}
		if(b[l]<=0){
			sbfmax[k]=b[l];
			sbfmin[k]=b[l];
			sbzmax[k]=-1;
			sbzmin[k]=MAXN;
			return;
		}
	}
	int mid=l+r>>1;
	build2(k<<1,l,mid);
	build2(k<<1|1,mid+1,r);
	sbzmax[k]=max(sbzmax[k<<1],sbzmax[k<<1|1]);
	sbzmin[k]=min(sbzmin[k<<1],sbzmin[k<<1|1]);
	sbfmax[k]=max(sbfmax[k<<1],sbfmax[k<<1|1]);
	sbfmin[k]=min(sbfmin[k<<1],sbfmin[k<<1|1]);
}
int queryazmax(int k,int l,int r,int x,int y){
	if(y<l||x>r) return -1;
	if(x<=l&&r<=y) return sazmax[k];
	int mid=l+r>>1;
	int res=-1;
	if(x<=mid) res=max(res,queryazmax(k<<1,l,mid,x,y));
	if(y>mid)  res=max(res,queryazmax(k<<1|1,mid+1,r,x,y));
	return res;
}
int queryazmin(int k,int l,int r,int x,int y){
	if(y<l||x>r) return MAXN;
	if(x<=l&&r<=y) return sazmin[k];
	int mid=l+r>>1;
	int res=MAXN;
	if(x<=mid) res=min(res,queryazmin(k<<1,l,mid,x,y));
	if(y>mid)  res=min(res,queryazmin(k<<1|1,mid+1,r,x,y));
	return res;
}
int queryafmax(int k,int l,int r,int x,int y){
	if(y<l||x>r) return -MAXN;
	if(x<=l&&r<=y) return safmax[k];
	int mid=l+r>>1;
	int res=-MAXN;
	if(x<=mid) res=max(res,queryafmax(k<<1,l,mid,x,y));
	if(y>mid)  res=max(res,queryafmax(k<<1|1,mid+1,r,x,y));
	return res;
}
int queryafmin(int k,int l,int r,int x,int y){
	if(y<l||x>r) return 1; 
	if(x<=l&&r<=y) return safmin[k];
	int mid=l+r>>1;
	int res=1;
	if(x<=mid) res=min(res,queryafmin(k<<1,l,mid,x,y));
	if(y>mid)  res=min(res,queryafmin(k<<1|1,mid+1,r,x,y));
	return res;
}
int querybzmax(int k,int l,int r,int x,int y){
	if(y<l||x>r) return -1; 
	if(x<=l&&r<=y) return sbzmax[k];
	int mid=l+r>>1;
	int res=-1;
	if(x<=mid) res=max(res,querybzmax(k<<1,l,mid,x,y));
	if(y>mid)  res=max(res,querybzmax(k<<1|1,mid+1,r,x,y));
	return res;
}
int querybzmin(int k,int l,int r,int x,int y){
	if(y<l||x>r) return MAXN;
	if(x<=l&&r<=y) return sbzmin[k];
	int mid=l+r>>1;
	int res=MAXN;
	if(x<=mid) res=min(res,querybzmin(k<<1,l,mid,x,y));
	if(y>mid)  res=min(res,querybzmin(k<<1|1,mid+1,r,x,y));
	return res;
}
int querybfmax(int k,int l,int r,int x,int y){
	if(y<l||x>r) return -MAXN; 
	if(x<=l&&r<=y) return sbfmax[k];
	int mid=l+r>>1;
	int res=-MAXN;
	if(x<=mid) res=max(res,querybfmax(k<<1,l,mid,x,y));
	if(y>mid)  res=max(res,querybfmax(k<<1|1,mid+1,r,x,y));
	return res;
}
int querybfmin(int k,int l,int r,int x,int y){
	if(y<l||x>r) return 1;
	if(x<=l&&r<=y) return sbfmin[k];
	int mid=l+r>>1;
	int res=1;
	if(x<=mid) res=min(res,querybfmin(k<<1,l,mid,x,y));
	if(y>mid)  res=min(res,querybfmin(k<<1|1,mid+1,r,x,y));
	return res;
}
signed main(){
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		cin>>b[i];
	}
	build1(1,1,n);
	build2(1,1,m);
	for(int i=1;i<=q;i++){
		int l1,r1,l2,r2;
		scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2);
		int azmax=queryazmax(1,1,n,l1,r1),azmin=queryazmin(1,1,n,l1,r1);
		int afmax=queryafmax(1,1,n,l1,r1),afmin=queryafmin(1,1,n,l1,r1);
		int bzmax=querybzmax(1,1,m,l2,r2),bzmin=querybzmin(1,1,m,l2,r2);
		int bfmax=querybfmax(1,1,m,l2,r2),bfmin=querybfmin(1,1,m,l2,r2);
/*		cout<<" azmax= "<<azmax<<" azmin= "<<azmin<<" afmax= "<<afmax<<" afmin= "<<afmin<<endl;
		cout<<" bzmax= "<<bzmax<<" bzmin= "<<bzmin<<" bfmax= "<<bfmax<<" bfmin= "<<bfmin<<endl;
		cout<<endl;*/
		if(bzmin>=0){
			if(azmax>=0) printf("%lld\n",azmax*bzmin);
			else printf("%lld\n",afmax*bzmax);
			continue;
		}
		if(bzmax<0){
			if(afmin<=0) printf("%lld\n",afmin*bfmax);
			else printf("%lld\n",azmin*bfmin);
			continue;
		}
		if(-afmax==azmin){
			if(bzmax>=-bfmin) printf("%lld\n",azmin*bfmin);
			else printf("%lld\n",afmax*bzmax);
			continue;
		}
		if(-afmax>azmin){
			printf("%lld\n",azmin*bfmin);
			continue;
		}
		else{
			printf("%lld\n",afmax*bzmax);
			continue;
		}
	}
	return 0;
}
线段树的代码检查过了,没有问题,可能是思路上的问题(思路在注释里面),或者是代码实现上的问题。。。
求调,万分感谢!

回复

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

正在加载回复...