线段树做法,但是遇到了一个很离谱的错误
查看原帖
线段树做法,但是遇到了一个很离谱的错误
698678
zlinda楼主2023/2/4 22:33
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+7;
const int K=1e9+7;
int n,m,q,anss=-(K*K),a[N],b[N];
int f[10],g[10];//分别存a数组和b数组的四个ans的值 
struct hhh
{
	int l,r,mid,ans1,ans2,ans3,ans4;//ans1是区间最大值 ans2是区间最小值 ans3是区间最大负数 ans4是区间最小正数 
} v1[4*N],v2[4*N];
void chu()
{
	f[1]=-K; f[2]=K; f[3]=-K; f[4]=K;
	g[1]=-K; g[2]=K; g[3]=-K; g[4]=K;
} 
void build1(int x,int s,int t)
{
	v1[x].l=s; v1[x].r=t; v1[x].mid=(s+t)/2;
	if(s==t)
	{
		v1[x].ans1=a[t];
		v1[x].ans2=a[t];
		if(a[t]<0) v1[x].ans3=a[t],v1[x].ans4=K;
		else v1[x].ans3=-K,v1[x].ans4=a[t];
		return ;
	}
	build1(2*x,s,v1[x].mid);
	build1(2*x+1,v1[x].mid+1,t);
	v1[x].ans1=max(v1[2*x].ans1,v1[2*x+1].ans1);
	v1[x].ans2=min(v1[2*x].ans2,v1[2*x+1].ans2);
	v1[x].ans3=max(v1[2*x].ans3,v1[2*x+1].ans3);
	v1[x].ans4=min(v1[2*x].ans4,v1[2*x+1].ans4);
}
void build2(int x,int s,int t)
{
	v2[x].l=s; v2[x].r=t; v2[x].mid=(s+t)/2;
	if(s==t)
	{
		v2[x].ans1=b[t];
		v2[x].ans2=b[t];
		if(b[t]<0) v2[x].ans3=b[t],v2[x].ans4=K;
		else v2[x].ans3=-K,v2[x].ans4=b[t];
		return ;
	}
	build2(2*x,s,v2[x].mid);
	build2(2*x+1,v2[x].mid+1,t);
	v2[x].ans1=max(v2[2*x].ans1,v2[2*x+1].ans1);
	v2[x].ans2=min(v2[2*x].ans2,v2[2*x+1].ans2);
	v2[x].ans3=max(v2[2*x].ans3,v2[2*x+1].ans3);
	v2[x].ans4=min(v2[2*x].ans4,v2[2*x+1].ans4);
}
void ask1(int x,int s,int t)
{
	if(v1[x].l>=s&&v1[x].r<=t)
	{
		f[1]=max(v1[x].ans1,f[1]);
		f[2]=min(v1[x].ans2,f[2]);
		f[3]=max(v1[x].ans3,f[3]);
		f[4]=min(v1[x].ans4,f[4]);
		return ;
	}
	if(v1[x].r>=s) ask1(2*x,s,t);
	if(v1[x].mid<t) ask1(2*x+1,s,t);
}
void ask2(int x,int s,int t)
{
	if(v2[x].l>=s&&v2[x].r<=t)
	{
		g[1]=max(v2[x].ans1,g[1]);
		g[2]=min(v2[x].ans2,g[2]);
		g[3]=max(v2[x].ans3,g[3]);
		g[4]=min(v2[x].ans4,g[4]);
		return ;
	}
	if(v2[x].r>=s) ask2(2*x,s,t);
	if(v2[x].mid<t) ask2(2*x+1,s,t);
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); 
	
	chu();
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++) cin>>b[i];
	build1(1,1,n);
	build2(1,1,m);
//	ask1(1,1,n-1);
//	cout<<f[1]<<' '<<f[2]<<' '<<f[3]<<' '<<f[4];
	
	for(int i=1;i<=q;i++)
	{
		int l1,l2,r1,r2;
		cin>>l1>>r1>>l2>>r2;
//		cout<<l1<<' '<<l2<<' '<<r1<<' '<<r2;
//		ask1(1,1,3);
//		ask2(1,1,2);
		ask1(1,l1,r1);
		ask2(1,l2,r2);
		for(int j=1;j<=4;j++) 
		{
			int ddd=K*K;
			for(int k=1;k<=4;k++) ddd=min(ddd,f[j]*g[k]);
			anss=max(ddd,anss);
		}
		cout<<anss<<'\n';
		chu(); anss=-(K*K);
	}
	return 0;
}

这是我的代码,显示是运行错误自动停止了,但是我把第100行的调用函数直接变成ask1(1,1,3);就没有问题是什么情况?我也试了把变量名换一换但还是没有用,有没有大佬能帮我看看是错哪了?是不是数据类型哪里错了?

2023/2/4 22:33
加载中...