0分线段树求调
查看原帖
0分线段树求调
734533
封禁用户楼主2023/3/30 15:37

对于第一个大样例(样例3)的输出,本应该输出 -511411449471155,而我却输出 8630107792702832640,不知道哪里错了。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e6+10;
const int INF=1e17;
int max(int a,int b) {return a>=b?a:b;}
int min(int a,int b) {return a<=b?a:b;}
int n;
int a[N];
struct aa{
	int l,r,mx,mi,mxf,mif;
	bool k;
}t1[N];
void pu1(int now)
{
	t1[now].mx=max(t1[now*2].mx,t1[now*2+1].mx);
	t1[now].mi=min(t1[now*2].mi,t1[now*2+1].mi);
	t1[now].mxf=max(t1[now*2].mxf,t1[now*2+1].mxf);
	t1[now].mif=min(t1[now*2].mif,t1[now*2+1].mif);	
	t1[now].k=max(t1[now*2].k,t1[now*2+1].k);
}
void bu1(int now,int l,int r)
{
	t1[now].l=l,t1[now].r=r;
	if(l==r) 
	{
		t1[now].mx=t1[now].mi=a[l];
		if(a[l]==0) t1[now].k=1;
		if(a[l]<0) t1[now].mxf=a[l];
		else t1[now].mxf=-INF;
		if(a[l]>=0) t1[now].mif=a[l];
		else t1[now].mif=INF;
	}
	else
	{
		int mid=l+r>>1;
		bu1(now*2,l,mid),bu1(now*2+1,mid+1,r);
		pu1(now);
	}
}
int qumax1(int now,int l,int r)
{
	if(t1[now].l>=l&&t1[now].r<=r) return t1[now].mx;
	else
	{
		int maxx=-INF;
		int mid=t1[now].l+t1[now].r>>1;
		if(l<=mid) maxx=max(maxx,qumax1(now*2,l,r));
		if(mid<r) maxx=max(maxx,qumax1(now*2+1,l,r));
		return maxx;
	}	
}
int qumax1_f(int now,int l,int r)
{
	if(t1[now].l>=l&&t1[now].r<=r) return t1[now].mxf;
	else
	{
		int maxx=-INF;
		int mid=t1[now].l+t1[now].r>>1;
		if(l<=mid) maxx=max(maxx,qumax1_f(now*2,l,r));
		if(mid<r) maxx=max(maxx,qumax1_f(now*2+1,l,r));
		return maxx;
	}	
}
int qumin1(int now,int l,int r)	
{
	if(t1[now].l>=l&&t1[now].r<=r) return t1[now].mi;
	else
	{
		int minn=INF;
		int mid=t1[now].l+t1[now].r>>1;
		if(l<=mid) minn=min(minn,qumin1(now*2,l,r));
		if(mid<r) minn=min(minn,qumin1(now*2+1,l,r));
		return minn;
	}	
}
int qumin1_f(int now,int l,int r)	
{
	if(t1[now].l>=l&&t1[now].r<=r) return t1[now].mif;
	else
	{
		int minn=INF;
		int mid=t1[now].l+t1[now].r>>1;
		if(l<=mid) minn=min(minn,qumin1_f(now*2,l,r));
		if(mid<r) minn=min(minn,qumin1_f(now*2+1,l,r));
		return minn;
	}	
}
int m;
int b[N];
struct bb{
	int l,r,mx,mi,mxf,mif;
	bool k;
}t2[N];
void pu2(int now)
{
	t2[now].mx=max(t2[now*2].mx,t2[now*2+1].mx);
	t2[now].mi=min(t2[now*2].mi,t2[now*2+1].mi);
	t2[now].mxf=max(t2[now*2].mxf,t2[now*2+1].mxf);
	t2[now].mif=min(t2[now*2].mif,t2[now*2+1].mif);	
	t2[now].k=max(t2[now*2].k,t2[now*2+1].k);
}
void bu2(int now,int l,int r)
{
	t2[now].l=l,t2[now].r=r;
	if(l==r) 
	{
		t2[now].mx=t2[now].mi=b[l];
		if(b[l]==0) t2[now].k=1;
		if(b[l]<0) t2[now].mxf=b[l];
		else t2[now].mxf=-INF;
		if(b[l]>=0) t2[now].mif=b[l];
		else t2[now].mif=INF;
	}
	else
	{
		int mid=l+r>>1;
		bu2(now*2,l,mid),bu2(now*2+1,mid+1,r);
		pu2(now);
	}
}
int qumax2(int now,int l,int r)
{
	if(t2[now].l>=l&&t2[now].r<=r) return t2[now].mx;
	else
	{
		int maxx=-INF;
		int mid=t2[now].l+t2[now].r>>1;
		if(l<=mid) maxx=max(maxx,qumax2(now*2,l,r));
		if(mid<r) maxx=max(maxx,qumax2(now*2+1,l,r));
		return maxx;
	}	
}
int qumin2(int now,int l,int r)	
{
	if(t2[now].l>=l&&t2[now].r<=r) return t2[now].mi;
	else
	{
		int minn=INF;
		int mid=t2[now].l+t2[now].r>>1;
		if(l<=mid) minn=min(minn,qumin2(now*2,l,r));
		if(mid<r) minn=min(minn,qumin2(now*2+1,l,r));
		return minn;
	}	
}
int q;
signed main()
{
	freopen("game3.in","r",stdin);
	freopen("1.out","w",stdout);
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++) cin>>a[i];
	bu1(1,1,n);
	for(int i=1;i<=m;i++) cin>>b[i];
	bu2(1,1,m);
	for(int i=1;i<=q;i++)
	{
		int ans1,ans2,ans3,ans4;
		int l1,l2,r1,r2;cin>>l1>>r1>>l2>>r2;
		int k1=qumax1(1,l1,r1);
		if(k1==INF||k1==-INF) ans1=-INF;
		else if(k1==0) ans1=0;
		else if(k1>0) ans1=k1*qumin2(1,l2,r2);
		else ans1=k1*qumax2(1,l2,r2);
		
		int k2=qumin1(1,l1,r1);
		if(k2==INF||k2==-INF) ans2=-INF;
		if(k2==0) ans2=0;
		else if(k2>0) ans2=k2*qumin2(1,l2,r2);
		else ans2=k2*qumax2(1,l2,r2);
		
		int k3=qumax1_f(1,l1,r1);
		if(k3==INF||k3==-INF) ans3=-INF;
		if(k3==0) ans3=0;
		else if(k3>0) ans3=k3*qumin2(1,l2,r2);
		else ans3=k3*qumax2(1,l2,r2);
		
		int k4=qumin1_f(1,l1,r1);
		if(k4==INF||k4==-INF) ans4=-INF;
		if(k4==0) ans4=0;
		else if(k4>0) ans4=k4*qumin2(1,l2,r2);
		else ans4=k4*qumax2(1,l2,r2);		
		
		cout<<max(ans1,max(ans2,max(ans3,ans4)))<<endl;
	}	
}
2023/3/30 15:37
加载中...