请找出两个代码的区别,为啥一个全wa一个全对(都是我写的)
查看原帖
请找出两个代码的区别,为啥一个全wa一个全对(都是我写的)
679182
zhaosihang83楼主2024/10/5 12:02

代码1

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
struct node{
	int maz,miz,maf,mif,zero;
}wa[N*4],wb[N*4];
int a[N],b[N];
int n,m,q;
node pushup(node lc,node rc){
	node res;
	if(lc.maz&&rc.maz){
		res.maz = max(lc.maz,rc.maz);
		res.miz = min(lc.miz,rc.miz);
	}else{
		res.maz = lc.maz+rc.maz;
		res.miz = lc.miz+rc.miz;
	}
	if(lc.maf&&rc.maf){
		res.maf = max(lc.maf,rc.maf);
		res.miz = min(lc.mif,rc.mif);
	}else{
		res.maf = lc.maf+rc.maf;
		res.mif = lc.mif+rc.mif;
	}
	res.zero = lc.zero||rc.zero;
	return res;
}
void build(int k,int l,int r,node tr[],int e[]){
	if(l==r){
		if(e[l]>0){
			tr[k].maz = tr[k].miz = e[l];
		}else if(e[l]<0){
			tr[k].maf = tr[k].mif = e[l];
		}else{
			tr[k].zero = 1;
		}
		return;
	}
	int mid = l+r>>1;
	build(k<<1,l,mid,tr,e);
	build(k<<1|1,mid+1,r,tr,e);
	tr[k] = pushup(tr[k<<1],tr[k<<1|1]);
}
node query(int k,int l,int r,int x,int y,node tr[]){
	if(l>=x&&r<=y){
		return tr[k];
	}
	int mid = l+r>>1;
	if(x>mid)return query(k<<1|1,mid+1,r,x,y,tr);
	if(y<=mid)return query(k<<1,l,mid,x,y,tr);
	return pushup(query(k<<1,l,mid,x,y,tr),query(k<<1|1,mid+1,r,x,y,tr));
}
int main(){
	scanf("%d%d%d",&n,&m,&q);
	for(int i = 1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i = 1;i<=m;i++){
		scanf("%d",&b[i]);
	}
	build(1,1,n,wa,a);
	build(1,1,m,wb,b);
	int l1,l2,r1,r2;
	node n1,n2;
	long long ans = 0;
	while(q--){
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		n1 = query(1,1,n,l1,r1,wa);
		n2 = query(1,1,m,l2,r2,wb);
		if(n2.mif!=0&&n2.miz==0){
			if(n1.mif!=0){
				ans = (n2.zero)?0:n1.mif*n2.maf;
			}else{
				ans = (n1.zero)?0:n1.miz*n2.mif;
			}
		}else if(n2.mif==0&&n2.miz!=0){
			if(n1.miz!=0){
				ans = (n2.zero)?0:n1.maz*n2.miz; 
			}else{
				ans = (n1.zero)?0:n1.maf*n2.maz;
			}
		}else{
			if(n1.zero){
				ans = 0;
			}else if(n1.mif!=0&&n1.miz==0){
				ans = n1.maf*n2.maz;
			}else if(n1.mif==0&&n1.miz!=0){
				ans = n1.miz*n2.mif;
			}else{
				ans = max(n1.miz*n2.mif,n1.maf*n2.maz);
			}
		}
		printf("%lld\n",ans); 
	}

	return 0;
}

#### 代码2
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n,m,q,a[N],b[N];
struct node{
	long long maz,miz,maf,mif,zero;
}ta[N*4],tb[N*4];
node pushup(node lc,node rc){
	node res;
	if(lc.maz&&rc.maz){
		res.maz = max(lc.maz,rc.maz);
		res.miz = min(lc.miz,rc.miz);
	}else{
		res.maz = lc.maz+rc.maz;
		res.miz = lc.miz+rc.miz;
	}
	if(lc.maf&&rc.maf){
		res.maf = max(lc.maf,rc.maf);
		res.mif = min(lc.mif,rc.mif);
	}else{
		res.maf = lc.maf+rc.maf;
		res.mif = lc.mif+rc.mif;
	}
	res.zero = lc.zero||rc.zero;
	return res;
}
void build(int k,int l,int r,node tr[],int e[]){
	if(l==r){
		if(e[l]>0){
			tr[k].maz = tr[k].miz = e[l];
		}else if(e[l]<0){
			tr[k].maf = tr[k].mif = e[l];
		}else{
			tr[k].zero = 1;
		}
		return;
	}
	int mid = l+r>>1;
	build(k<<1,l,mid,tr,e);
	build(k<<1|1,mid+1,r,tr,e);
	tr[k] = pushup(tr[k<<1],tr[k<<1|1]);
}
node query(int k,int l,int r,int x,int y,node tr[]){
	if(l>=x&&r<=y){
		return tr[k];
	}
	int mid = l+r>>1;
	if(x>mid)return query(k<<1|1,mid+1,r,x,y,tr);
	if(y<=mid)return query(k<<1,l,mid,x,y,tr);
	return pushup(query(k<<1,l,mid,x,y,tr),query(k<<1|1,mid+1,r,x,y,tr));
}
int main(){
	scanf("%d%d%d",&n,&m,&q);
	for(int i = 1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i = 1;i<=m;i++){
		scanf("%d",&b[i]);
	}
	build(1,1,n,ta,a);
	build(1,1,m,tb,b);
	int l1,l2,r1,r2;
	node n1,n2;
	long long ans = 0;
	while(q--){
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		n1 = query(1,1,n,l1,r1,ta);
		n2 = query(1,1,m,l2,r2,tb);
		if(n2.mif!=0&&n2.miz==0){
			if(n1.mif!=0){
				ans = (n2.zero)?0:n1.mif*n2.maf;
			}else{
				ans = (n1.zero)?0:n1.miz*n2.mif;
			}
		}else if(n2.mif==0&&n2.miz!=0){
			if(n1.miz!=0){
				ans = (n2.zero)?0:n1.maz*n2.miz; 
			}else{
				ans = (n1.zero)?0:n1.maf*n2.maz;
			}
		}else{
			if(n1.zero){
				ans = 0;
			}else if(n1.mif!=0&&n1.miz==0){
				ans = n1.maf*n2.maz;
			}else if(n1.mif==0&&n1.miz!=0){
				ans = n1.miz*n2.mif;
			}else{
				ans = max(n1.miz*n2.mif,n1.maf*n2.maz);
			}
		}
		printf("%lld\n",ans); 
	}

	return 0;
}
2024/10/5 12:02
加载中...