线段树做法85pts求助
查看原帖
线段树做法85pts求助
574215
OneLeft楼主2023/10/19 20:15

rt,讨论区hack数据全过

code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
class Segment_tree
{
	private:
		int node_max[N*4],node_min[N*4];
		int Node_max[N*4],Node_min[N*4];
		void push_up(int id)
		{
			node_max[id]=max(node_max[id*2],node_max[id*2+1]);
			node_min[id]=min(node_min[id*2],node_min[id*2+1]);
			Node_max[id]=max(Node_max[id*2],Node_max[id*2+1]);
			Node_min[id]=min(Node_min[id*2],Node_min[id*2+1]);
		}
	public:
		void build(int id,int l,int r,int a[N])
		{
			if(l==r)
			{
				node_max[id]=node_min[id]=a[l];
				if(a[l]<0)Node_max[id]=a[l],Node_min[id]=1e18+5;
				if(a[l]>0)Node_min[id]=a[l],Node_max[id]=-1e18-5;
				if(a[l]==0)Node_min[id]=0,Node_max[id]=0;
			}
			else
			{
				int mid=(l+r)/2;
				build(id*2,l,mid,a),build(id*2+1,mid+1,r,a);
				push_up(id);
			}
		}
		int query_max(int id,int l,int r,int x,int y)
		{
			if(x<=l&&r<=y)return node_max[id];
			int mid=(l+r)/2,res=-1e18-5;
			if(x<=mid)res=max(res,query_max(id*2,l,mid,x,y));
			if(y>mid)res=max(res,query_max(id*2+1,mid+1,r,x,y));
			return res;
		}
		int query_min(int id,int l,int r,int x,int y)
		{
			if(x<=l&&r<=y)return node_min[id];
			int mid=(l+r)/2,res=1e18+5;
			if(x<=mid)res=min(res,query_min(id*2,l,mid,x,y));
			if(y>mid)res=min(res,query_min(id*2+1,mid+1,r,x,y));
			return res;
		}
		int query_maxn(int id,int l,int r,int x,int y)
		{
			if(x<=l&&r<=y)return Node_max[id];
			int mid=(l+r)/2,res=-1e18-5;
			if(x<=mid)res=max(res,query_maxn(id*2,l,mid,x,y));
			if(y>mid)res=max(res,query_maxn(id*2+1,mid+1,r,x,y));
			return res;
		}
		int query_minn(int id,int l,int r,int x,int y)
		{
			if(x<=l&&r<=y)return Node_min[id];
			int mid=(l+r)/2,res=1e18+5;
			if(x<=mid)res=min(res,query_minn(id*2,l,mid,x,y));
			if(y>mid)res=min(res,query_minn(id*2+1,mid+1,r,x,y));
			return res;
		}
}T1,T2;
int n,m,q,a[N],b[N],l1,r1,l2,r2;
signed main()
{
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=m;i++)cin>>b[i];
	T1.build(1,1,n,a),T2.build(1,1,m,b);
	for(int i=1;i<=q;i++)
	{
		cin>>l1>>r1>>l2>>r2;
		int t11=T1.query_max(1,1,n,l1,r1),t12=T1.query_min(1,1,n,l1,r1);
		int t13=T1.query_maxn(1,1,n,l1,r1),t14=T1.query_minn(1,1,n,l1,r1);
		int t21=T2.query_max(1,1,m,l2,r2),t22=T2.query_min(1,1,m,l2,r2);
		if(t12>0&&t22>0)cout<<t11*t22<<'\n';
		if(t12>0&&t21<0)cout<<t12*t22<<'\n';
		if(t12>0&&t21>0&&t22<0)cout<<t12*t22<<'\n';
		if(t11<0&&t22>0)cout<<t11*t21<<'\n';
		if(t11<0&&t21<0)cout<<t12*t21<<'\n';
		if(t11<0&&t21>0&&t22<0)cout<<t11*t21<<'\n';
		if(t11>0&&t12<0&&t22>0)cout<<t11*t22<<'\n';
		if(t11>0&&t12<0&&t21<0)cout<<t12*t21<<'\n';
		if(t11>0&&t12<0&&t21>0&&t22<0)cout<<max(t13*t21,t14*t22)<<'\n';
		if(t11==0&&t12==0&&t21==0&&t22==0)cout<<"0\n";
	}
	return 0;
}
2023/10/19 20:15
加载中...