社区讨论
玄关,线段树样例过了0分求条
P8818[CSP-S 2022] 策略游戏参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhj0ftr9
- 此快照首次捕获于
- 2025/11/03 18:41 4 个月前
- 此快照最后确认于
- 2025/11/03 18:41 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
int inf=1000000000;
int n,m,q;
int a[100005];
int af[100005];
int aff[100005];
int b[100005];
int fmx[400005];
int ffmn[400005];
int mx[400005][2];
int mn[400005][2];
void build1(int l,int r,int p,int t){
if(l==r){
if(t==0){
mx[p][t]=a[l];
}
if(t==1){
mx[p][t]=b[l];
}
return ;
}
int mid=(l+r)>>1;
build1(l,mid,p*2,t),build1(mid+1,r,p*2+1,t);
mx[p][t]=max(mx[p*2][t],mx[p*2+1][t]);
}
void build2(int l,int r,int p,int t){
if(l==r){
if(t==0){
mn[p][t]=a[l];
}
if(t==1){
mn[p][t]=b[l];
}
return ;
}
int mid=(l+r)>>1;
build2(l,mid,p*2,t),build2(mid+1,r,p*2+1,t);
mn[p][t]=min(mn[p*2][t],mn[p*2+1][t]);
}
void builda1(int l,int r,int p){
if(l==r){
fmx[p]=af[l];
return ;
}
int mid=(l+r)>>1;
builda1(l,mid,p*2),builda1(mid+1,r,p*2+1);
fmx[p]=max(fmx[p*2],fmx[p*2+1]);
}
void builda2(int l,int r,int p){
if(l==r){
ffmn[p]=aff[l];
return ;
}
int mid=(l+r)>>1;
builda2(l,mid,p*2),builda2(mid+1,r,p*2+1);
ffmn[p]=min(ffmn[p*2],ffmn[p*2+1]);
}
int query1(int l,int r,int s,int e,int p,int t){
if(s<=l&&r<=e){
return mx[p][t];
}
int mid=(l+r)>>1;
int ans=-inf;
if(s<=mid){
ans=query1(l,mid,s,e,p*2,t);
}
if(e>mid){
ans=max(ans,query1(mid+1,r,s,e,p*2+1,t));
}
return ans;
}
int query2(int l,int r,int s,int e,int p,int t){
if(s<=l&&r<=e){
return mn[p][t];
}
int mid=(l+r)>>1;
int ans=inf;
if(s<=mid){
ans=query2(l,mid,s,e,p*2,t);
}
if(e>mid){
ans=min(ans,query2(mid+1,r,s,e,p*2+1,t));
}
return ans;
}
int queryf(int l,int r,int s,int e,int p){
if(s<=l&&r<=e){
// std::cout << l << ' ' << r << std::endl;
// cout<<fmx[p]<<"A\n";
return fmx[p];
}
int mid=(l+r)>>1;
int ans=-inf;
// std::cout << l << ' ' << mid << std::endl;
if(s<=mid){
ans=queryf(l,mid,s,e,p*2);
// cout<<ans<< l << ' ' << mid <<"B\n";
}
if(e>mid){
ans=max(ans,queryf(mid+1,r,s,e,p*2+1));
// cout<<ans<< l << ' ' << mid<<"C\n";
}
return ans;
}
int queryff(int l,int r,int s,int e,int p){
if(s<=l&&r<=e){
return ffmn[p];
}
int mid=(l+r)>>1;
int ans=inf;
if(s<=mid){
ans=queryff(l,mid,s,e,p*2);
}
if(e>mid){
ans=min(ans,queryff(mid+1,r,s,e,p*2+1));
}
return ans;
}
int main(){
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]>=0){
af[i]=-inf;
aff[i]=a[i];
}
else{
af[i]=a[i];
aff[i]=inf;
}
}
for(int i=1;i<=m;i++){
cin>>b[i];
}
build1(1,n,1,0);
build1(1,m,1,1);
build2(1,n,1,0);
build2(1,m,1,1);
builda1(1,n,1);
builda2(1,n,1);
while(q--){
int l1,l2,r1,r2;
cin>>l1>>r1>>l2>>r2;
int afmx=queryf(1,n,l1,r1,1),affmn=queryff(1,n,l1,r1,1),amx=query1(1,n,l1,r1,1,0),amn=query2(1,n,l1,r1,1,0),bmx=query1(1,m,l2,r2,1,1),bmn=query2(1,m,l2,r2,1,1);
// cout<<afmx<<' '<<affmn<<' '<<amx<<' '<<amn<<' '<<bmx<<' '<<bmn<<"\n";
if(bmn>=0){
if(amx<=0){
cout<<amx*bmx<<"\n";
continue;
}
if(amx>=0){
cout<<amx*bmn<<"\n";
continue;
}
}
if(bmx<=0){
if(amn<=0){
cout<<amn*bmx<<"\n";
continue;
}
if(amn>=0){
cout<<amn*bmn<<"\n";
continue;
}
}
if(bmn<=0&&bmx>=0){
if(affmn==0){
cout<<0<<"\n";
continue;
}
if(amn>=0){
cout<<bmn*amn<<"\n";
continue;
}
if(amx<=0){
cout<<bmx*amx<<"\n";
continue;
}
if(amn<=0&&0<=amx){
cout<<max(affmn*bmn,afmx*bmx)<<"\n";
continue;
}
}
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...