社区讨论
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 条回复,欢迎继续交流。
正在加载回复...