社区讨论

为什么编译失败???????

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 条回复,欢迎继续交流。

正在加载回复...