悬关,线段树代码求调
查看原帖
悬关,线段树代码求调
670324
nafonsn楼主2023/9/10 18:38
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
const ll inf=1e18+10;
ll a[N],b[N];
struct tree
{
	int l,r;
	ll minf,minz,maxf,maxz;
	//线段树维护四个值 
	//minf最小的负数
	//minz最小的整数
	//maxf最大的负数
	//maxz最大的正数 
}wa[N*4],wb[N*4];//wa是a数组建的树,wb是b数组建的树 
void pushupa(int u)
{
	wa[u].maxf=max(wa[u<<1].maxf,wa[u<<1|1].maxf);
	wa[u].minf=min(wa[u<<1].minf,wa[u<<1|1].minf);
	wa[u].maxz=max(wa[u<<1].maxz,wa[u<<1|1].maxz);
	wa[u].minz=min(wa[u<<1].minz,wa[u<<1|1].minz);
}
void builda(int u,int l,int r)
{
	wa[u].l=l;
	wa[u].r=r;
	if(l==r)
	{
		if(a[l]<0) 
		{
			wa[u].minf=a[l];
			wa[u].maxf=a[l];
			wa[u].minz=inf;//最小的正数肯定比inf小,因此此区间无贡献 
			wa[u].maxz=-1;//最大的正数肯定比-1大,因此此区间无贡献 
		}
		else
		{
			wa[u].minz=a[l];
			wa[u].maxz=a[l];
			wa[u].minf=1;//最小的负数肯定比1小,因此此区间无贡献 
			wa[u].maxf=-inf;//最大的负数肯定比-inf小,因此此区间无贡献 
		}
	}
	int m=(l+r)>>1;
	builda(u<<1,l,m);
	builda(u<<1|1,m+1,r);
	pushupa(u);
}

ll queryminfa(int u,int l,int r)
{
	if(l<=wa[u].l&&wa[u].r<=r)
		return wa[u].minf;
	else if(wa[u].l>r||wa[u].r<l)
		return 1;
	else 
		return min(queryminfa(u<<1,l,r),queryminfa(u<<1|1,l,r));
}
ll queryminza(int u,int l,int r)
{
	if(l<=wa[u].l&&wa[u].r<=r)
		return wa[u].minz;
	else if(wa[u].l>r||wa[u].r<l)
		return inf;
	else 
		return min(queryminza(u<<1,l,r),queryminza(u<<1|1,l,r));
}
ll querymaxza(int u,int l,int r)
{
	if(l<=wa[u].l&&wa[u].r<=r)
		return wa[u].maxz;
	else if(wa[u].l>r||wa[u].r<l)
		return -1;
	else 
		return max(querymaxza(u<<1,l,r),querymaxza(u<<1|1,l,r));
}
ll querymaxfa(int u,int l,int r)
{
	if(l<=wa[u].l&&wa[u].r<=r)
		return wa[u].maxf;
	else if(wa[u].l>r||wa[u].r<l)
		return -inf;
	else 
		return max(querymaxfa(u<<1,l,r),querymaxfa(u<<1|1,l,r));
}
void pushupb(int u)
{
	wb[u].maxf=max(wb[u<<1].maxf,wb[u<<1|1].maxf);
	wb[u].minf=min(wb[u<<1].minf,wb[u<<1|1].minf);
	wb[u].maxz=max(wb[u<<1].maxz,wb[u<<1|1].maxz);
	wb[u].minz=min(wb[u<<1].minz,wb[u<<1|1].minz);
}
void buildb(int u,int l,int r)
{
	wb[u].l=l;
	wb[u].r=r;
	if(l==r)
	{
		if(b[l]<0) 
		{
			wb[u].minf=b[l];
			wb[u].maxf=b[l];
			wb[u].minz=inf;
			wb[u].maxz=-1;
		}
		else
		{
			wb[u].minz=b[l];
			wb[u].maxz=b[l];
			wb[u].minf=1;
			wb[u].maxf=-inf;
		}
	}
	int m=(l+r)>>1;
	buildb(u<<1,l,m);
	buildb(u<<1|1,m+1,r);
	pushupb(u);
}
ll queryminfb(int u,int l,int r)
{
	if(l<=wb[u].l&&wb[u].r<=r)
		return wb[u].minf;
	else if(wb[u].l>r||wb[u].r<l)
		return 1;
	else 
		return min(queryminfb(u<<1,l,r),queryminfb(u<<1|1,l,r));
}
ll queryminzb(int u,int l,int r)
{
	if(l<=wb[u].l&&wb[u].r<=r)
		return wb[u].minz;
	else if(wb[u].l>r||wb[u].r<l)
		return inf;
	else 
		return min(queryminzb(u<<1,l,r),queryminzb(u<<1|1,l,r));
}
ll querymaxzb(int u,int l,int r)
{
	if(l<=wb[u].l&&wb[u].r<=r)
		return wb[u].maxz;
	else if(wb[u].l>r||wb[u].r<l)
		return -1;
	else 
		return max(querymaxzb(u<<1,l,r),querymaxzb(u<<1|1,l,r));
}
ll querymaxfb(int u,int l,int r)
{
	if(l<=wb[u].l&&wb[u].r<=r)
		return wb[u].maxf;
	else if(wb[u].l>r||wb[u].r<l)
		return -inf;
	else 
		return max(querymaxfb(u<<1,l,r),querymaxfb(u<<1|1,l,r));
}
ll ans(int l1,int r1,int l2,int r2)
{
	ll finalans=-inf;
	
	bool situ1=1;
	ll ans1;
	ll a1=querymaxza(1,l1,r1);
	ll b1=queryminzb(1,l2,r2);
	if(a1==-1||b1==inf) situ1=0;
	if(situ1) ans1=a1*b1;
	
	bool situ2=1;
	ll ans2;
	ll a2=queryminza(1,l1,r1);
	ll b2=queryminfb(1,l2,r2);
	if(a2==inf||b2==1) situ2=0;
	if(situ2) ans2=a2*b2;
	
	bool situ3=1;
	ll ans3;
	ll a3=querymaxfa(1,l1,r1);
	ll b3=querymaxzb(1,l2,r2);
	if(a3==-inf||b3==-1) situ3=0;
	if(situ3) ans3=a3*b3;
	
	bool situ4=1;
	ll ans4;
	ll a4=queryminfa(1,l1,r1);
	ll b4=querymaxfb(1,l2,r2);
	if(a4==1||b4==-inf) situ4=0;
	if(situ4) ans4=a4*b4; 
	
	if(situ1) finalans=max(finalans,ans1);
	if(situ2) finalans=max(finalans,ans2);
	if(situ3) finalans=max(finalans,ans3);
	if(situ4) finalans=max(finalans,ans4);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n,m,q;
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=m;i++)
		cin>>b[i];
	builda(1,1,n);
	buildb(1,1,m);
	cout<<wa[1].maxf;
	for(int i=1;i<=q;i++)
	{
		int l1,r1,l2,r2;
		cout<<ans(l1,r1,l2,r2)<<"\n";
	}
}
2023/9/10 18:38
加载中...