社区讨论
为什么编译失败???????
P8818[CSP-S 2022] 策略游戏参与者 4已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lo7k3ong
- 此快照首次捕获于
- 2023/10/27 03:07 2 年前
- 此快照最后确认于
- 2023/10/27 03:07 2 年前
CPP
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
int n,m,q;
int a[100001],b[100001];
struct node{
int zmax=-0x7fffffff,zmin=0x7fffffff,fmax=-0x7fffffff,fmin=0x7fffffff;
int zero=0;
}at[1000100];
struct nod{
int zmax=-0x7fffffff,zmin=0x7fffffff,fmax=-0x7fffffff,fmin=0x7fffffff;
int zero=0;
}bt[1000100];
void adown(int n){
at[n].zero=(at[n*2].zero|at[n*2+1].zero);
at[n].fmax=max(at[n*2].fmax,at[n*2+1].fmax);
at[n].fmin=min(at[n*2].fmin,at[n*2+1].fmin);
at[n].zmax=max(at[n*2].zmax,at[n*2+1].zmax);
at[n].zmin=min(at[n*2].zmin,at[n*2+1].zmin);
}
void bdown(int n){
bt[n].zero=(bt[n*2].zero|bt[n*2+1].zero);
bt[n].fmax=max(bt[n*2].fmax,bt[n*2+1].fmax);
bt[n].fmin=min(bt[n*2].fmin,bt[n*2+1].fmin);
bt[n].zmax=max(bt[n*2].zmax,bt[n*2+1].zmax);
bt[n].zmin=min(bt[n*2].zmin,bt[n*2+1].zmin);
}
void abuild(int l,int r,int n){
if(l==r){
int t;
cin >>t;
if(t==0)at[n].zero=1;
else if(t>0)at[n].zmax=at[n].zmin=t;
else at[n].fmax=at[n].fmin=t;
return;
}
int mid=(l+r)/2;
abuild(l,mid,n*2);
abuild(mid+1,r,n*2+1);
adown(n);
}
void bbuild(int l,int r,int n){
if(l==r){
int t;
cin >>t;
if(t==0)bt[n].zero=1;
else if(t>0)bt[n].zmax=bt[n].zmin=t;
else bt[n].fmax=bt[n].fmin=t;
return;
}
int mid=(l+r)/2;
bbuild(l,mid,n*2);
bbuild(mid+1,r,n*2+1);
bdown(n);
}
long long afind(int l,int r,int n,int L,int R,int flag){//flag 1=zmax 2=zmin 3=fmax 4=fmin
if(L<=l&&r<=R){
if(flag==1){
return at[n].zmax;
}
if(flag==2){
return at[n].zmin;
}
if(flag==3){
return at[n].fmax;
}
if(flag==4){
return at[n].fmin;
}
if(flag==5){
return at[n].zero;
}
}
int mid=(l+r)/2;
int lv=0,rv=0;
if(flag==1||flag==3)lv=rv=-0x7fffffff;
if(flag==2||flag==4)lv=rv=0x7fffffff;
if(L<=mid)lv=afind(l,mid,n*2,L,R,flag);
if(R>mid)rv=afind(mid+1,r,n*2+1,L,R,flag);
if(flag==1||flag==3)return max(lv,rv);
if(flag==2||flag==4)return min(lv,rv);
return lv|rv;
}
long long bfind(int l,int r,int n,int L,int R,int flag){//flag 1=zmax 2=zmin 3=fmax 4=fmin
if(L<=l&&r<=R){
if(flag==1){
return bt[n].zmax;
}
if(flag==2){
return bt[n].zmin;
}
if(flag==3){
return bt[n].fmax;
}
if(flag==4){
return bt[n].fmin;
}
if(flag==5){
return bt[n].zero;
}
}
int mid=(l+r)/2;
int lv=0,rv=0;
if(flag==1||flag==3)lv=rv=-0x7fffffff;
if(flag==2||flag==4)lv=rv=0x7fffffff;
if(L<=mid)lv=bfind(l,mid,n*2,L,R,flag);
if(R>mid)rv=bfind(mid+1,r,n*2+1,L,R,flag);
if(flag==1||flag==3)return max(lv,rv);
if(flag==2||flag==4)return min(lv,rv);
return lv|rv;
}
int main(){
cin >>n>>m>>q;
abuild(1,n,1);
bbuild(1,m,1);
// for(int i=1;i<=m;i++)cout <<bfind(1,m,1,i,i,2)<<" ";
// cout <<endl;
for(int i=1;i<=q;i++){
int l1,r1,l2,r2;
cin >>l1>>r1>>l2>>r2;
int azero=afind(1,n,1,l1,r1,5);
long long azmax=afind(1,n,1,l1,r1,1);
long long azmin=afind(1,n,1,l1,r1,2);
long long afmax=afind(1,n,1,l1,r1,3);
long long afmin=afind(1,n,1,l1,r1,4);
long long bzmax=bfind(1,m,1,l2,r2,1);
long long bzmin=bfind(1,m,1,l2,r2,2);
long long bfmax=bfind(1,m,1,l2,r2,3);
long long bfmin=bfind(1,m,1,l2,r2,4);
// cout <<azero<<" "<<azmax<<" "<<azmin<<" "<<afmax<<" "<<afmin<<" "<<endl;
// cout <<bzmax<<" "<<bzmin<<" "<<bfmax<<" "<<bfmin<<" "<<endl;
if(bzmax!=-0x7fffffff&&bfmin!=0x7fffffff){
if(azero){
cout <<0<<endl;
continue;
}
if(azmax!=-0x7fffffff&&afmin!=0x7fffffff){
cout <<max(azmin*bfmin,afmax*bzmax)<<endl;
//cout <<"-"<<endl;
continue;
}
if(azmax==-0x7fffffff&&afmin!=0x7fffffff){
cout <<afmax*bzmax<<endl;
//cout <<"--"<<endl;
continue;
}
if(azmax!=-0x7fffffff&&afmin==0x7fffffff){
cout <<azmin*bfmin<<endl;
//cout <<"---"<<endl;
continue;
}
}else if(bzmax==-0x7fffffff&&bfmin==0x7fffffff){
cout <<0<<endl;
continue;
}else if(bfmin==0x7fffffff&&bzmax!=-0x7fffffff){
if(azmax!=-0x7fffffff){
cout <<azmax*bzmin<<endl;
//cout <<"----"<<endl;
continue;
}else if(azero){
cout <<0<<endl;
continue;
}else{
cout <<afmax*bzmax;
//cout <<"-----"<<endl;
continue;
}
}else if(bzmax==-0x7fffffff){
if(afmin!=0x7fffffff){
cout <<afmin*bfmax<<endl;
//cout <<afmin<<"------"<<bfmax<<endl;
continue;
}else if(azero){
cout <<0<<endl;
continue;
}else{
cout <<azmin*bfmin;
//cout <<"-------"<<endl;
continue;
}
}else{
cout <<0<<endl;
}
}
return 0;
}
/*
*/
回复
共 3 条回复,欢迎继续交流。
正在加载回复...