蒟蒻求调
查看原帖
蒟蒻求调
1343796
ak5ac楼主2025/7/21 23:23
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct tree{
	ll mz;
	ll xz;
	ll mf;
	ll xf;
	int zo;
};
int k[100003];
int z[100003];
tree t[400005];
tree p[400005];
int d[11];
int n,m,q;
void in1(int l,int r,int b){
	if(l==r){
		if(k[l]>0){
			t[b].mz = k[l];
			t[b].xz = k[l];
		}else if(k[l]==0)t[b].zo = 1;
		else{
			t[b].mf = k[l];
			t[b].xf = k[l];
		}
		return ;
	}
	int mid = (l+r)/2;
	in1(l,mid,2*b);
	in1(mid+1,r,2*b+1);
	t[b].mz = max(t[2*b].mz,t[2*b+1].mz);
	if(t[2*b].xz==0)t[b].xz = t[2*b+1].xz;
	else if(t[2*b+1].xz==0)t[b].xz = t[2*b].xz;
	else t[b].xz = min(t[2*b].mz,t[2*b+1].mz);
	
	t[b].xf = min(t[2*b].xf,t[2*b+1].xf);
	if(t[2*b].mf==0)t[b].mf = t[2*b+1].mf;
	else if(t[2*b+1].mf==0)t[b].mf = t[2*b].mf;
	else t[b].mf = max(t[2*b].mf,t[2*b+1].mf);
	
	t[b].zo = max(t[2*b].zo,t[2*b+1].zo);
}
void in2(int l,int r,int b){
	if(l==r){
		if(z[l]>0){
			p[b].mz = z[l];
			p[b].xz = z[l];
		}else if(z[l]==0)p[b].zo = 1;
		else{
			p[b].mf = z[l];
			p[b].xf = z[l];
		}
		//cout<<p[b].mz<<" "<<p[b].xz<<" "<<p[b].xf<<" "<<p[b].mf<<" "<<p[b].zo<<" ";
		//cout<<l<<" "<<r<<" "<<b<<"\n"; 
		return ;
	}
	int mid = (l+r)/2;
	in2(l,mid,2*b);
	in2(mid+1,r,2*b+1);
	p[b].mz = max(p[2*b].mz,p[2*b+1].mz);
	if(p[2*b].xz==0)p[b].xz = p[2*b+1].xz;
	else if(p[2*b+1].xz==0)p[b].xz = p[2*b].xz;
	else p[b].xz = min(p[2*b].mz,p[2*b+1].mz);
	
	p[b].xf = min(p[2*b].xf,p[2*b+1].xf);
	if(p[2*b].mf==0)p[b].mf = p[2*b+1].mf;
	else if(p[2*b+1].mf==0)p[b].mf = p[2*b].mf;
	else p[b].mf = max(p[2*b].mf,p[2*b+1].mf);
	
	p[b].zo = max(p[2*b].zo,p[2*b+1].zo);
	//cout<<p[b].mz<<" "<<p[b].xz<<" "<<p[b].xf<<" "<<p[b].mf<<" "<<p[b].zo<<" ";
	//cout<<l<<" "<<r<<" "<<b<<"\n"; 
}
tree qk(int l,int r,int k,int x,int y){
	int md = (l+r)/2;
	if(x<=l&&y>=r) return t[k];
	tree se,s1,s2;
	if(x<=md)  se = qk(l,md,k*2,x,y);
	if(y>=md+1){
		s1 = qk(md+1,r,k*2+1,x,y);
		if(x<=md){
			s2 = se;
			se.zo = max(s2.zo,s1.zo);
			se.mz = max(s2.mz,s1.mz);
			se.xf = min(s2.xf,s1.xf);
			if(!s2.xz) se.xz = s1.xz;
			else if(!s1.xz)se.xz = s2.xz;
			else se.xz = min(s1.xz,s2.xz);
			
			if(!s2.mf) se.mf = s1.mf;
			else if(!s1.mf)se.mf = s2.mf;
			else se.mf = max(s1.mf,s2.mf);
		}
		else se = s1;
	}
	return se;
} 
tree qc (int l,int r,int k,int x,int y){
	int md = (l+r)/2;
	if(x<=l&&y>=r) return p[k];
	tree se,s1,s2;
	if(x<=md)  se = qc(l,md,k*2,x,y);
	if(y>=md+1){
		s1 = qc(md+1,r,k*2+1,x,y);
		if(x<=md){
			s2 = se;
			se.zo = max(s2.zo,s1.zo);
			se.mz = max(s2.mz,s1.mz);
			se.xf = min(s2.xf,s1.xf);
			if(!s2.xz) se.xz = s1.xz;
			else if(!s1.xz)se.xz = s2.xz;
			else se.xz = min(s1.xz,s2.xz);
			
			if(!s2.mf) se.mf = s1.mf;
			else if(!s1.mf)se.mf = s2.mf;
			else se.mf = max(s1.mf,s2.mf);
		}
		else se = s1;
	}
	return se;
} 
ll fd(tree x,tree y){	//big,small
	ll ds;
	if(x.mf==0&&y.mf==0) ds = x.mz*y.xz;
	else if(x.mf==0&&y.xz==0) ds = x.xz*y.xf;
	else if(x.xz==0&&y.xz==0) ds = x.xf*y.mf;
	else if(x.xz==0&&y.mf==0) ds = x.mf*y.mz;
	
	else if(y.mf==0) ds = x.mz*y.xz;
	else if(x.mf==0) ds = x.xz*y.xf;
	else if(y.xz==0) ds = x.xf*y.mf;
	else if(x.xz==0) ds = x.mf*y.mz;
	else ds = max(x.mf*y.mz,x.xz*y.xf);
	ll e3 = 1;
	if(x.zo) ds = max(e3*0,ds);
	if(y.zo) ds = min(e3*0,ds);
	return ds;
}
int main(){
	//freopen("q.txt","r",stdin);
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++)cin>>k[i];
	for(int j=1;j<=m;j++)cin>>z[j];
	in1(1,n,1);
	in2(1,m,1);
	for(int i=1;i<=q;i++){
		ll l1,l2,r1,r2;
		cin>>l1>>r1>>l2>>r2;
		tree h1 = qk(1,n,1,l1,r1);
		tree h2 = qc(1,m,1,l2,r2);
		cout<<fd(h1,h2)<<"\n";
	}
	return 0;
}

求调!

没线段树多久所以掌握的不好

感觉思路与题解差不多

却只对了4个测试点

十分感谢!!!

2025/7/21 23:23
加载中...